请问谁能详细介绍mysql的数据类型呢?

请问谁能详细介绍mysql的数据类型呢?,第1张

MySQL 数据类型细分下来,大概有以下几类:

数值,典型代表为 tinyint,int,bigint 浮点/定点,典型代表为 float,double,decimal 以及相关的同义词 字符串,典型代表为 char,varchar 时间日期,典型代表为 date,datetime,time,timestamp 二进制,典型代表为 binary,varbinary 位类型 枚举类型

集合类型

以下内容,我们在另一篇文章介绍

大对象,比如 text,blob json 文档类型 一、数值类型(不是数据类型,别看错了)如果用来存放整数,根据范围的不同,选择不同的类型。

以上是几个整数选型的例子。整数的应用范围最广泛,可以用来存储数字,也可以用来存储时间戳,还可以用来存储其他类型转换为数字后的编码,如 IPv4 等。示例 1用 int32 来存放 IPv4 地址,比单纯用字符串节省空间。表 x1,字段 ipaddr,利用函数 inet_aton,检索的话用函数 inet_ntoa。 查看磁盘空间占用,t3 占用最大,t1 占用最小。所以说如果整数存储范围有固定上限,并且未来也没有必要扩容的话,建议选择最小的类型,当然了对其他类型也适用。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl总用量 3.0G3541825 861M -rw-r----- 1 mysql mysql 860M 12月 10 11:36 t1.ibd3541820 989M -rw-r----- 1 mysql mysql 988M 12月 10 11:38 t2.ibd3541823 1.2G -rw-r----- 1 mysql mysql 1.2G 12月 10 11:39 t3.ibd 二、浮点数 / 定点数先说 浮点数,float 和 double 都代表浮点数,区别简单记就是 float 默认占 4 Byte。float(p) 中的 p 代表整数位最小精度。如果 p >24 则直接转换为 double,占 8 Byte。p 最大值为 53,但最大值存在计算不精确的问题。再说 定点数,包括 decimal 以及同义词 numeric,定点数的整数位和小数位分别存储,有效精度最大不能超过 65。所以区别于 float 的在于精确存储,必须需要精确存储或者精确计算的最好定义为 decimal 即可。示例 3创建一张表 y1,分别给字段 f1,f2,f3 不同的类型。mysql-(ytt/3305)->create table y1(f1 float,f2 double,f3 decimal(10,2))Query OK, 0 rows affected (0.03 sec)

三、字符类型字符类型和整形一样,用途也很广。用来存储字符、字符串、MySQL 所有未知的类型。可以简单说是万能类型!

char(10) 代表最大支持 10 个字符存储,varhar(10) 虽然和 char(10) 可存储的字符数一样多,不同的是 varchar 类型存储的是实际大小,char 存储的理论固定大小。具体的字节数和字符集相关。示例 4例如下面表 t4 ,两个字段 c1,c2,分别为 char 和 varchar。mysql-(ytt/3305)->create table t4 (c1 char(20),c2 varchar(20))Query OK, 0 rows affected (0.02 sec)

所以在 char 和 varchar 选型上,要注意看是否合适的取值范围。比如固定长度的值,肯定要选择 char;不确定的值,则选择 varchar。

四、日期类型日期类型包含了 date,time,datetime,timestamp,以及 year。year 占 1 Byte,date 占 3 Byte。 

 time,timestamp,datetime 在不包含小数位时分别占用 3 Byte,4 Byte,8 Byte;小数位部分另外计算磁盘占用,见下面表格。

请点击输入图片描述

注意:timestamp 代表的时间戳是一个 int32 存储的整数,取值范围为 '1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999';datetime 取值范围为 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。 

综上所述,日期这块类型的选择遵循以下原则:

1. 如果时间有可能超过时间戳范围,优先选择 datetime。2. 如果需要单独获取年份值,比如按照年来分区,按照年来检索等,最好在表中添加一个 year 类型来参与。3. 如果需要单独获取日期或者时间,最好是单独存放,而不是简单的用 datetime 或者 timestamp。后面检索时,再加函数过滤,以免后期增加 SQL 编写带来额外消耗。

4. 如果有保存毫秒类似的需求,最好是用时间类型自己的特性,不要直接用字符类型来代替。MySQL 内部的类型转换对资源额外的消耗也是需要考虑的。

示例 5

建立表 t5,对这些可能需要的字段全部分离开,这样以后写 SQL 语句的时候就很容易了。 当然了,这种情形占用额外的磁盘空间。如果想在易用性与空间占用量大这两点来折中,可以用 MySQL 的虚拟列来实时计算。比如假设 c5 字段不存在,想要得到 c5 的结果。mysql-(ytt/3305)->alter table t5 drop c5, add c5 year generated always as (year(c1)) virtualQuery OK, 1 row affected (2.46 sec)Records: 1  Duplicates: 0  Warnings: 0

五、二进制类型

binary 和 varbinary 对应了 char 和 varchar 的二进制存储,相关的特性都一样。不同的有以下几点:

binary(10)/varbinary(10) 代表的不是字符个数,而是字节数。

行结束符不一样。char 的行结束符是 \0,binary 的行结束符是 0x00。

由于是二进制存储,所以字符编码以及排序规则这类就直接无效了。

示例 6

来看这个 binary 存取的简单示例,还是之前的变量 @a。

切记!这里要提前计算好 @a 占用的字节数,以防存储溢出。

六、位类型

bit 为 MySQL 里存储比特位的类型,最大支持 64 比特位, 直接以二进制方式存储,一般用来存储状态类的信息。比如,性别,真假等。具有以下特性:

1. 对于 bit(8) 如果单纯存放 1 位,左边以 0 填充 00000001。2. 查询时可以直接十进制来过滤数据。3. 如果此字段加上索引,MySQL 不会自己做类型转换,只能用二进制来过滤。

示例 7

创建表 c1, 字段性别定义一个比特位。mysql-(ytt/3305)->create table c1(gender bit(1))Query OK, 0 rows affected (0.02 sec)

mysql-(ytt/3305)->select cast(gender as unsigned)  'f1' from c1+------+| f1   |+------+|    0 ||    1 |+------+2 rows in set (0.00 sec)

过滤数据也一样,二进制或者直接十进制都行。mysql-(ytt/3305)->select conv(gender,16,10) as gender \   ->from c1 where gender = b'1' +--------+| gender |+--------+| 1      |+--------+1 row in set (0.00 sec)    mysql-(ytt/3305)->select conv(gender,16,10) as gender \    ->from c1 where gender = '1'+--------+| gender |+--------+| 1      |+--------+1 row in set (0.00 sec)

其实这样的场景,也可以定义为 char(0),这也是类似于 bit 非常优化的一种用法。

mysql-(ytt/3305)->create table c2(gender char(0))Query OK, 0 rows affected (0.03 sec)

那现在我给表 c1 简单的造点测试数据。

mysql-(ytt/3305)->select count(*) from c1+----------+| count(*) |+----------+| 33554432 |+----------+1 row in set (1.37 sec)

把 c1 的数据全部插入 c2。

mysql-(ytt/3305)->insert into c2 select if(gender = 0,'',null) from c1Query OK, 33554432 rows affected (2 min 18.80 sec)Records: 33554432  Duplicates: 0  Warnings: 0

两张表的磁盘占用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl总用量 1.9G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1.ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2.ibd

检索方式稍微有些不同,不过效率也差不多。所以说,字符类型不愧为万能类型。

七、枚举类型

枚举类型,也即 enum。适合提前规划好了所有已经知道的值,且未来最好不要加新值的情形。枚举类型有以下特性:

1. 最大占用 2 Byte。2. 最大支持 65535 个不同元素。3. MySQL 后台存储以下标的方式,也就是 tinyint 或者 smallint 的方式,下标从 1 开始。4. 排序时按照下标排序,而不是按照里面元素的数据类型。所以这点要格外注意。

示例 8

创建表 t7。mysql-(ytt/3305)->create table t7(c1 enum('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'))Query OK, 0 rows affected (0.03 sec)

八、集合类型

集合类型 SET 和枚举类似,也是得提前知道有多少个元素。SET 有以下特点:

1. 最大占用 8 Byte,int64。2. 内部以二进制位的方式存储,对应的下标如果以十进制来看,就分别为 1,2,4,8,...,pow(2,63)。3. 最大支持 64 个不同的元素,重复元素的插入,取出来直接去重。4. 元素之间可以组合插入,比如下标为 1 和 2 的可以一起插入,直接插入 3 即可。

示例 9

定义表 c7 字段 c1 为 set 类型,包含了 8 个值,也就是下表最大为 pow(2,7)。

mysql-(ytt/3305)->create table c7(c1 set('mysql','oracle','dble','postgresql','mongodb','redis','db2','sql server'))Query OK, 0 rows affected (0.02 sec)

插入 1 到 128 的所有组合。

mysql-(ytt/3305)->INSERT INTO c7WITH RECURSIVE ytt_number (cnt) AS (        SELECT 1 AS cnt        UNION ALL        SELECT cnt + 1        FROM ytt_number        WHERE cnt <pow(2, 7)    )SELECT *FROM ytt_numberQuery OK, 128 rows affected (0.01 sec)Records: 128  Duplicates: 0  Warnings: 0

九、数据类型在存储函数中的用法

函数里除了显式声明的变量外,默认 session 变量的数据类型很弱,随着给定值的不同随意转换。

示例 10

定义一个函数,返回两个给定参数的乘积。定义里有两个变量,一个是 v_tmp 显式定义为 int64,另外一个 @vresult 随着给定值的类型随意变换类型。

简单调用下。

mysql-(ytt/3305)->select ytt_sample_data_type(1111,222) 'result'+--------------------------+| result                   |+--------------------------+| The result is: '246642'. |+--------------------------+1 row in set (0.00 sec)

总结

本篇把 MySQL 基本的数据类型做了简单的介绍,并且用了一些容易理解的示例来梳理这些类型。我们在实际场景中,建议选择适合最合适的类型,不建议所有数据类型简单的最大化原则。比如能用 varchar(100),不用 varchar(1000)。

库建立好之后基本不动,和我们接触最频繁的是表. 建表就是声明字段的过程!

选择合适的类型[速度快 减少硬盘占用]

存储空间,还是存储范围有区别?

答案: 两者本质完全一样 ,只是在一些特殊情况下两者显示有区别(只是在显示的时候补全0的位数不一样)

实验

*zerofill 零填充(本字段同时即自动带有unsigned属性,因为负数不能零填充)

如 数字2在固定宽度4时 零填充 即为0002

M值是一个整数(固定宽度值),只有在字段有零填充zerofill属性时 规定M值才有意义!

M值只是 显示效果 ,不会影响实际数据值!

如M值为1,实际值255,一样会显示255

列可以声明默认值(推荐声明)

因为null无法和别的值比较

null = 0 返回null

null <>0 返回null

null只能用is或is not比较 null is null当然对的。

例子:

【浮点型】有误差,不稳定!定点数更精确。

实际测试数据

Float(M,D)

M精度(总位数,不包含点) 精度值M 影响 存储的 值的范围.

D标度(小数位) 小数点后有几位(mysql比较特殊,mssql/oracle都不能指定)

testcolumn float(5,2) unsigned 范围0到999.99

float(5,2)的范围-999.99到999.99

给float(5,2)这样的字段插入值在进位时有一些规矩:暂时没搞清楚,不是简单的四舍五入

插入值688.826实际是688.83 末尾6 进位

插入值688.825实际是688.83 末尾5 进位

插入值688.824实际是688.82 末尾4 舍去

插入值688.005实际是688.00

插入值688.015实际是688.01 末尾5 5前面是1 舍去

插入值688.025实际是688.02 末尾5 5前面是2 舍去

插入值688.035实际是688.03 末尾5 5前面是3 舍去

插入值688.045实际是688.04 末尾5 5前面是4 舍去

一般使用tinyint、char(1)、enum类型。

varchar(M)

M代表宽度 即可容纳的【字符数】 (并不是字节数) varchar占用的字节数与编码有关:

utf-8 一个汉字3字节 英文字母1字节

对于utf8mb4号称占用4字节但是并不绝对(在utf8可以覆盖到的范围则仍然占用3字节)

utf8mb4最有优势的应用场景:存储emoji表情

例子:

性能太差,不推荐

MySQL在5.6.4版本之后,TimeStamp和DateTime支持到微妙

一个例子:

以如下这张表为例

show privileges 命令可以查看全部权限

查询时从user->db->table_pirv->columns_pirv依次验证,如果通过则执行查询。

本课程涉及建表SQL

场景1:歌单按时间排序

场景2:统计云音乐创建歌单的用户

场景3-1:统计云音乐创建歌单的用户列表和每人创建歌单的数量。

场景3-2:统计云音乐创建歌单的用户列表和每人创建歌单的数量,并且只显示歌单数量排序大于等于2的用户

SQL进阶语法-like

场景4:查询一个月内创建歌单(从第6行开始显示10条记录)

场景5:对于未录入歌曲的歌单(trackcount = null),输出结果时歌曲数返回0.

连接的作用是用一个SQL语句把多个表中相互关联的数据查出来

场景6:查询收藏“老男孩”歌单的用户列表

子查询:内层查询的结果作为外层的比较条件。一般子查询都可以转换成连接,推荐使用连接。

场景7:查询出没有用户收藏的歌单

场景8:老板想看创建和收藏歌单的所有用户,查询play_list和play_fav两表中所有的userid

实例还是上节中的那些表

场景1:查询每张专辑总的点播次数和每首歌的平均点播次数。

场景2:查询全部歌曲中的最大的播放次数和最小的播放次数。

场景2续:查询播放次数最多的歌曲

count(*) 和 count(1) 基本一样,没有明显的性能差异。

count(*) 和 count(song_name) 差别在于 count(song_name) 会除去song_name is null的情况

场景3:显示每张专辑的歌曲列表

实例:查询一个月内userid为1,3,5的用户创建的歌单

学生表:

用于更正成绩的触发器:

一、分区概念

分区是将一个表分成多个区块进行 *** 作和保存,从而降低每次 *** 作的数据,提高性能。而对于应用来说则是透明的,从逻辑上看只有一张表,但在物理上这个表可能是由多个物理分区组成的,每个分区都是独立的对象,可以进行独立处理。

二、分区作用

1.可以逻辑数据分割,分割数据能够有多个不同的物理文件路径。

2.可以存储更多的数据,突破系统单个文件最大限制。

3.提升性能,提高每个分区的读写速度,提高分区范围查询的速度。

4.可以通过删除相关分区来快速删除数据

5.通过跨多个磁盘来分散数据查询,从而提高磁盘I/O的性能。

6.涉及到例如SUM()、COUNT()这样聚合函数的查询,可以很容易的进行并行处理。

7.可以备份和恢复独立的分区,这对大数据量很有好处。

三、分区能支持的引擎

MySQL支持大部分引擎创建分区,入MyISAM、InnoDB等;不支持MERGE和CSV等来创建分区。同一个分区表中的所有分区必须是同一个存储引擎。值得注意的是,在MySQL8版本中,MyISAM表引擎不支持分区。

四、确认MySQL支持分区

从MySQL5.1开始引入分区功能,可以如下方式查看是否支持:

老版本用:SHOW VARIABLES LIKE '%partition%'

新版本用:show plugins

五、分区类型

1. RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。

例如,可以将一个表通过年份划分成两个分区,2001 -2010年、2011-2020。

2. LIST分区:类似于RANGE分区,LIST是列值匹配一个离散值集合中的某个值来进行选择。

比如 根据字段 把值为1、3、5的放到一起,2、4、6的另外放到一起 等等...

3. HASH分区:基于用户定义的表达式的返回值来进行选择分区,该表达式使用将要插入到表中的这些行的列值来进行计算,这个函数必须产生非负整数值。

通过HASH运算来进行分区,分布的比较均匀

4. KEY分区:类似于按HASH分区,由MySQL服务器提供其自身的哈希函数。

按照KEY进行分区类似于按照HASH分区

六、分区创建注意事项

1. 如果表中存在primary key 或者 unique key 时,分区的列必须是paimary key或者unique key的一个组成部分,也就是说,分区函数的列只能从pk或者uk这些key中取子集

2. 如果表中不存在任何的paimary key或者unique key,则可以指定任何一个列作为分区列

3. 5.5版本前的RANGE、LIST、HASH分区要求分区键必须是int;MySQL5.5及以上,支持非整形的RANGE和LIST分区,即:range columns 和 list columns (可以用字符串来进行分区)。

七、分区命名

1. 分区的名字基本上遵循其他MySQL 标识符应当遵循的原则,例如用于表和数据库名字的标识符。应当注意的是, 分区的名字是不区分大小写的 。

2. 无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录。

八、 创建分区

1. RANGE分区:

CREATE TABLE `test01` (

`dayid` int(11) DEFAULT NULL,

`mac` varchar(32) NOT NULL DEFAULT '',

`dtype` varchar(50) NOT NULL DEFAULT ''

) ENGINE=InnoDB DEFAULT CHARSET=utf8

/*!50100 PARTITION BY LIST (dayid)

(PARTITION p20171205 VALUES IN (20171205) ENGINE = InnoDB,

PARTITION p20171204 VALUES IN (20171204) ENGINE = InnoDB,

PARTITION p20171206 VALUES IN (20171206) ENGINE = InnoDB,

PARTITION p20171207 VALUES IN (20171207) ENGINE = InnoDB) */

解读:以上为 uuid小于5时放到p0分区下,uuid大于5且小于10放到p1分区下,uuid大于10且小于15放到p2分区下,uuid大于15 一直到最大值的存在p3分区下

2. LIST分区:

CREATE TABLE tbl_test (

uuid INT NOT NULL,

title VARCHAR(20)

)

)

PARTITION BY List (uuid) (

PARTITION p0 VALUES in (1,2,3,5),

PARTITION p1 VALUES in (7,9,10),

PARTITION p2 VALUES in (11,15)

)

)

解读:以上为uuid 等于1/2/3/5时放到p0分区,7/9/10放到p1分区,11/15放到p2分区。当时用insert into时 如果uuid的值不存在p0/p1/p2分区时,则会插入失败而报错。

3. HASH分区:

HASH分区主要用来确保数据在预先确定数目的分区中平均分布。在RANGE分区和LIST分区中必须明确指定一个指定的列值或列值集合以指定应该保存在哪个分区中。而在HASH分区中,MySQL会自动完成这些工作,要做的只是基于将要被哈希的列值指定一个表达式,以及指定被分区的表将要被分割成的分区数量,如:

CREATE TABLE tbl_test (

uuid INT NOT NULL,

title VARCHAR(20)

))

PARTITION BY HASH (uuid) (

PARTITIONS 3

))

解读:MySQL自动创建3个分区,在执行insert into时,根据插入的uuid通过算法来自动分配区间。

注意:

(1) 由于每次插入、更新、删除一行,这个表达式都要计算一次,这意味着非常复杂的表达式可能会引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候。

(2) 最有效率的哈希函数是只对单个表列进行计算,并且它的值随列值进行一致的增大或减小,因为这考虑了在分区范围上的“修剪”。也就是说,表达式值和它所基于的列的值变化越接近,就越能有效地使用该表达式来进行HASH分区。

3.1:线性HASH分区

线性HASH分区在“PARTITION BY”子句中添加“LINEAR”关键字。

线性HASH分区的有点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有及其大量数据的表。它的缺点在于各个分区间数据的分布不大可能均衡。

4. KEY分区

类似于HASH分区,HASH分区允许用户自定义的表达式,而KEY分区则不允许使用用户自定义的表达式;HASH分区只支持整数分区,KEY分区支持除了blob和text类型之外的其他数据类型分区。

与HASH分区不同,创建KEY分区表的时候,可以不指定分区键,默认会选择使用主键或唯一键作为分区键,没有主键或唯一键,就必须指定分区键。

CREATE TABLE tbl_test (

uuid INT NOT NULL,

title VARCHAR(20)

))

PARTITION BY LINEAR Key (uuid)

PARTITIONS 3

解读:根据分区键来进行分区

5. 子分区

子分区是分区表中,每个分区的再次分割,适合保存非常大量的数据。

CREATE TABLE tbl_test (

registerTime Date

))

PARTITION BY GANGE(YEAR(registerTime))

SUBPARTITION BY HASH (TO_DAYS(registerTime))

SUBPARTITIONS 2

(

PARTITION p0 VALUES LESS THAN (2017),

PARTITION p1 VALUES LESS THAN (2020),

PARTITION p2 VALUES LESS THAN MAXVALUE

)

解读:主分区使用RANGE按照年来进行分区,有3个RANGE分区。这3个分区中又被进一步分成了2个子分区,实际上,整个表被分成了3 * 2 = 6个分区。每个子分区按照天进行HASH分区。小于2017的放在一起,2017-2020的放在一起,大于2020的放在一起。

注意:

(1) 在MySQL5.1中,对于已经通过RANGE或LIST分区了的表在进行子分区是可能的。子分区既可以使用HASH分区,也可以使用KEY分区。这也被称为复合分区。

(2) 每个分区必须有相同数量的子分区。

(3) 如果在一个分区表上的任何分区上使用SUBPARTITION来明确定义任何子分区,那么就必须定义所有的子分区。

(4) 每个SUBPARTITION子句必须包含(至少)子分区的一个名字。

(5) 在每个子分区内,子分区的名字必须是惟一的,目前在整个表中,也要保持唯一。例如:

PARTITION BY RANGE(YEAR(registerTime))

SUBPARTITION BY HASH(TO_DAYS(registerTime))

(

PARTITION p0 VALUES LESS THAN (2017) (

SUBPARTITION s0,

SUBPARTITION s1

),

PARTITION p1 VALUES LESS THAN (2020) (

SUBPARTITION s2,

SUBPARTITION s3

),

PARTITION p2 VALUES LESS THAN MAXVALUE (

SUBPARTITION s4,

SUBPARTITION s5

)

)

子分区可以用于特别大的表,可以在多个磁盘间分配数据和索引。例如:

SUBPARTITION s0

DATA DIRECTORY = '/disk0/data'

INDEX DIRECTORY = '/disk0/idx'

,

,

SUBPARTITION s1

DATA DIRECTORY = '/disk1/data'

INDEX DIRECTORY = '/disk1/idx'

九、MySQL分区处理NULL值的方式

MySQL中的分区禁止空值NULL上没有进行处理,无论它是一个列值还是一个用户定义表达式的值,一般而言,在这种情况下MySQL把NULL视为0。如果你希望回避这种做法,你应该在设计表时声明列“NOT NULL”。

十、分区管理概述

可以对分区进行添加、删除、重新定义、合并或拆分等管理 *** 作。

① RANGE和LIST分区的管理

1. 删除分区语句如:alter table tbl_test drop partition p0

注意:

(1) 当删除了一个分区,也同时删除了该分区中所有的数据。

(2) 可以通过show create table tbl_test来查看新的创建表的语句。

(3) 如果是LIST分区的话,删除的数据不能新增进来,因为这些行的列值包含在已经删除了的分区的值列表中。

2. 添加分区语句如:alter table tbl_test add partition(partition p3 values less than(50))

注意:

(1) 对于RANGE分区的表,只可以添加新的分区到分区列表的最高端。

(2) 对于LIST分区的表,不能添加已经包含在现有分区值列表中的任意值。

3. 如果希望能不丢失数据的条件下重新定义分区,可以使用如下语句:

ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO(partition_definitions)

(1) 拆分分区如:

ALTER TABLE tbl_name REORGANIZE PARTITION partition_list INTO(partition s0 values less than(5),partition s1 values less than(10))

或者如:

ALTER TABLE tbl_name REORGANIZE PARTITION p0 INTO(partition s0 values in(1,2,3), partition s1 values in(4,5))

(2) 合并分区如:ALTER TABLE tbl_name REORGANIZE PARTITION s0,s1 INTO(partition p0 values in(1,2,3,4,5))

4. 删除所有分区,但保留数据,形式:ALTER TABLE tbl_name remove partitioning

② HASH和KEY分区的管理

1. 减少分区数量语句如:ALTER TABLE tbl_name COALESCE PARTITION 2

2. 添加分区数量语句如:ALTER TABLE tbl_name add PARTITION partitions 2

③ 其他分区管理语句

1. 重建分区 :类似于先删除保存在分区中的所有记录,然后重新插入它们,可用于整理分区碎片。如:ALTER table tbl_name REBUILD PARTITION p2,p3

2. 优化分区 :如果从分区中删除了大量的行,或者对一个带有可变长度的行(也就是说,有VARCHAR,BLOB或TEXT类型的列)做了许多修改,可以使用 ALTER TABLE tbl_name OPTIMIZE PARTITION来收回没有使用的空间,并整理分区数据文件的碎片。如:ALTER TABLE tbl_name OPTIMIZE PARTITION p2,p3

3. 分析分区 :读取并保存分区的键分布,如:ALTER TABLE tbl_name ANALYZE PARTITION p2,p3

4. 检查分区 :检查分区中的数据或索引是否已经被破坏,如:ALTER TABLE tbl_name CHECK PARTITION p2,p3

5. 修补分区 :修补被破坏的分区,如:ALTER TABLE tbl_name REPAIR PARTITION p2,p3

十、查看分区信息

1. 查看分区信息:select * from information_schema.partitions where table_schema='arch1' and table_name = 'tbl_test' G

2. 查看分区上的数据:select * from tbl_test partition(p0)

3. 查看MySQL会 *** 作的分区:explain partitions select * from tbl_test where uuid = 2

十一、 局限性

1. 最大分区数目不能超过1024,一般建议对单表的分区数不要超过50个。

2. 如果含有唯一索引或者主键,则分区列必须包含在所有的唯一索引或者主键在内。

3. 不支持外键。

4. 不支持全文索引,对分区表的分区键创建索引,那么这个索引也将被分区。

5. 按日期进行分区很合适,因为很多日期函数可以用。但是对字符串来说合适的分区函数不太多。

6. 只有RANGE和LIST分区能进行子分区,HASH和KEY分区不能进行子分区。

7. 临时表不能被分区。

8. 分区表对于单条记录的查询没有优势。

9. 要注意选择分区的成本,没插入一行数据都需要按照表达式筛选插入的分区。

10. 分区字段尽量不要可以为null


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7316361.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存