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总用量 30G3541825 861M -rw-r----- 1 mysql mysql 860M 12月 10 11:36 t1ibd3541820 989M -rw-r----- 1 mysql mysql 988M 12月 10 11:38 t2ibd3541823 12G -rw-r----- 1 mysql mysql 12G 12月 10 11:39 t3ibd
二、浮点数 / 定点数先说 浮点数,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 (003 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 (002 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:01000000' 到 '2038-01-19 03:14:07999999';datetime 取值范围为 '1000-01-01 00:00:00000000' 到 '9999-12-31 23:59:59999999'。
综上所述,日期这块类型的选择遵循以下原则:
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)) virtual;Query OK, 1 row affected (246 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 (002 sec)
mysql-(ytt/3305)->select cast(gender as unsigned) 'f1' from c1;+------+| f1 |+------+| 0 || 1 |+------+2 rows in set (000 sec)
过滤数据也一样,二进制或者直接十进制都行。mysql-(ytt/3305)->select conv(gender,16,10) as gender \ -> from c1 where gender = b'1'; +--------+| gender |+--------+| 1 |+--------+1 row in set (000 sec) mysql-(ytt/3305)->select conv(gender,16,10) as gender \ -> from c1 where gender = '1';+--------+| gender |+--------+| 1 |+--------+1 row in set (000 sec)
其实这样的场景,也可以定义为 char(0),这也是类似于 bit 非常优化的一种用法。
mysql-(ytt/3305)->create table c2(gender char(0));Query OK, 0 rows affected (003 sec)
那现在我给表 c1 简单的造点测试数据。
mysql-(ytt/3305)->select count() from c1;+----------+| count() |+----------+| 33554432 |+----------+1 row in set (137 sec)
把 c1 的数据全部插入 c2。
mysql-(ytt/3305)->insert into c2 select if(gender = 0,'',null) from c1;Query OK, 33554432 rows affected (2 min 1880 sec)Records: 33554432 Duplicates: 0 Warnings: 0
两张表的磁盘占用差不多。root@ytt-pc:/var/lib/mysql/3305/ytt# ls -sihl总用量 19G4085684 933M -rw-r----- 1 mysql mysql 932M 12月 11 10:16 c1ibd4082686 917M -rw-r----- 1 mysql mysql 916M 12月 11 10:22 c2ibd
检索方式稍微有些不同,不过效率也差不多。所以说,字符类型不愧为万能类型。
七、枚举类型
枚举类型,也即 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 (003 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 (002 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_number;Query OK, 128 rows affected (001 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 (000 sec)
总结
本篇把 MySQL 基本的数据类型做了简单的介绍,并且用了一些容易理解的示例来梳理这些类型。我们在实际场景中,建议选择适合最合适的类型,不建议所有数据类型简单的最大化原则。比如能用 varchar(100),不用 varchar(1000)。
MySQL的字段类型
char(length)
char类型最大长度是255个字符。当插入到表中的字符串的长度小于length时候,将给字段右边不够的部分用空格填补。
varchar(length)
varchar的最大长度是255个字符。varchar和char几乎一样,区别在于varchar是变长的类型,不会填补空格。
tinytext
tinytext最大长度是255字符。
text
text最大长度是65535(2的17次方)字符。
mediumtext
mediumtext最大长度是16777215个字符。
longtext
longtext最大长度是4294976259个字符。
(tinytext,text,mediumtext,longtext这四种类型,都是可边长字段类型,与varchar一样,只是最大长度不同而已)
VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度,而不是取决于类型的最大可能尺寸。
例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度,加上1个字节以记录字符串的长度。对于字符串’abcd’,长度是4而存储要求是5个字节。
BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。
VARCHAR需要定义大小,有255的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。
有助于效率的类型选择
使你的数据尽可能小
最基本的优化之一是使你的数据(和索引)在磁盘上(并且在内存中)占据的空间尽可能小 这能给出巨大的改进 因为磁盘读入较快并且通常也用较少的主存储器 如果在更小的列上做索引 索引也占据较少的资源
你能用下面的技术使表的性能更好并且使存储空间最小
·尽可能地使用最有效(最小)的类型 MySQL有很多节省磁盘空间和内存的专业化类型
·如果可能使表更小 使用较小的整数类型 例如 MEDIUMINT经常比INT好一些
·如果可能 声明列为NOT NULL 它使任何事情更快而且你为每列节省一位 注意如果在你的应用程序中你确实需要NULL 你应该毫无疑问使用它 只是避免缺省地在所有列上有它
使用定长列 不使用可变长列
这条准则对被经常修改 从而容易产生碎片的表来说特别重要 例如 应该选择 CHAR 列而不选择 VARCHAR 列 所要权衡的是使用定长列时 表所占用的空间更多 但如果能够承担这种空间的耗费 使用定长行将比使用可变长的行处理快得多
将列定义为 NOT NULL
这样处理更快 所需空间更少 而且有时还能简化查询 因为不需要检查是否存在特例 NULL
考虑使用 ENUM 列
如果有一个只含有限数目的特定值的列 那么应该考虑将其转换为 ENUM 列 ENUM 列的值可以更快地处理 因为它们在内部是以数值表示的
有关BLOB和TEXT类型
使用BLOB和TEXT类型的优点
用 BLOB 存储应用程序中包装或未包装的数据 有可能使原来需要几个检索 *** 作才能完成的数据检索得以在单个检索 *** 作中完成 而且还对存储标准表结构不易表示的数据或随时间变化的数据有帮助
使用BLOB和TEXT类型的可能弊端
另一方面 BLOB 值也有自己的固有问题 特别是在进行大量的 DELETE 或 UPDATE *** 作时更是如此 删除 BLOB 会在表中留下一个大空白 在以后将需用一个记录或可能是不同大小的多个记录来填充
除非有必要 否则应避免检索较大的 BLOB 或 TEXT 值 例如 除非肯定WHERE 子句能够将结果恰好限制在所想要的行上 否则 SELECT 查询不是一个好办法 这样做可能会将非常大的 BLOB 值无目的地从网络上拖过来 这是存储在另一列中的 BLOB 标识信息很有用的另一种情形 可以搜索该列以确定想要的行 然后从限定的行中检索 BLOB 值
必要的准则
对容易产生碎片的表使用 OPTIMIZE TABLE
大量进行修改的表 特别是那些含有可变长列的表 容易产生碎片 碎片不好 因为它在存储表的磁盘块中产生不使用的空间 随着时间的增长 必须读取更多的块才能取到有效的行 从而降低了性能 任意具有可变长行的表都存在这个问题 但这个问题对 BLOB 列更为突出 因为它们尺寸的变化非常大 经常使用 OPTIMIZE TABLE 有助于保持性能不下降
使用多列索引
多列索引列有时很有用 一种技术是根据其他列建立一个散列值 并将其存储在一个独立的列中 然后可通过搜索散列值找到行 这只对精确匹配的查询有效 (散列值对具有诸如 < 或 >= 这样的 *** 作符的范围搜索没有用处) 在MySQL 版及以上版本中 散列值可利用 MD ( ) 函数产生 散列索引对 BLOB 列特别有用 有一事要注意 在 MySQL 以前的版本中 不能索引 BLOB 类型 甚至是在 或更新的版本中 利用散列值作为标识值来查找 BLOB 值也比搜索 BLOB 列本身更快
将 BLOB 值隔离在一个独立的表中
在某些情况下 将 BLOB 列从表中移出放入另一个副表可能具有一定的意义 条件是移出 BLOB 列后可将表转换为定长行格式 这样会减少主表中的碎片 而且能利用定长行的性能优势
使用ANALYSE过程检查表列
如果使用的是 MySQL 或更新的版本 应该执行 PROCEDURE ANALYSE( ) 查看它所提供的关于表中列的信息
ANALYSE([max elements [max memory]])
它检验来自你的查询的结果并返回结果的分析
max elements(缺省 )是 yse将注意的每列不同值的最大数量 这被ANALYSE用来检查最佳的列类型是否应该是ENUM类型
max memory(缺省 )是在 yse尝试寻找所有不同值的时候应该分配给每列的最大内存量
SELECT FROM WHERE PROCEDURE ANALYSE([max elements [max memory]])
例如
mysql>SELECT FROM student PROCEDURE ANALYSE();
mysql>SELECT FROM student PROCEDURE ANALYSE( );
相应输出中有一列是关于表中每列的最佳列类型的建议 第二个例子要求 PROCEDURE ANALYSE( ) 不要建议含有多于 个值或取多于 字节的 ENUM 类型(可根据需要更改这些值) 如果没有这样的限制 输出可能会很长;ENUM 的定义也会很难阅读
lishixinzhi/Article/program/MySQL/201311/29636
分区介绍:
一、什么是分区?
所谓分区,就是将一个表分成多个区块进行 *** 作和保存,从而降低每次 *** 作的数据,提高性能。而对于应用来说则是透明的,从逻辑上看只有一张表,但在物理上这个表可能是由多个物理分区组成的,每个分区都是独立的对象,可以进行独立处理。
二、分区作用
1可以逻辑数据分割,分割数据能够有多个不同的物理文件路径。
2可以存储更多的数据,突破系统单个文件最大限制。
3提升性能,提高每个分区的读写速度,提高分区范围查询的速度。
4可以通过删除相关分区来快速删除数据
5通过跨多个磁盘来分散数据查询,从而提高磁盘I/O的性能。
6涉及到例如SUM()、COUNT()这样聚合函数的查询,可以很容易的进行并行处理。
7可以备份和恢复独立的分区,这对大数据量很有好处。
三、分区能支持的引擎
MySQL支持大部分引擎创建分区,入MyISAM、InnoDB等;不支持MERGE和CSV等来创建分区。同一个分区表中的所有分区必须是同一个存储引擎。值得注意的是,在MySQL8版本中,MyISAM表引擎不支持分区。
四、确认MySQL支持分区
从MySQL51开始引入分区功能,可以如下方式查看是否支持:
老版本用: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 55版本前的RANGE、LIST、HASH分区要求分区键必须是int;MySQL55及以上,支持非整形的RANGE和LIST分区,即:range columns 和 list columns (可以用字符串来进行分区)。
七、分区命名
1 分区的名字基本上遵循其他MySQL 标识符应当遵循的原则,例如用于表和数据库名字的标识符。应当注意的是,分区的名字是不区分大小写的。
2 无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录。
八、 创建分区
1 RANGE分区:
解读:以上为 uuid小于5时放到p0分区下,uuid大于5且小于10放到p1分区下,uuid大于10且小于15放到p2分区下,uuid大于15 一直到最大值的存在p3分区下
2 LIST分区:
解读:以上为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会自动完成这些工作,要做的只是基于将要被哈希的列值指定一个表达式,以及指定被分区的表将要被分割成的分区数量,如:
解读:MySQL自动创建3个分区,在执行insert into时,根据插入的uuid通过算法来自动分配区间。
注意:
(1) 由于每次插入、更新、删除一行,这个表达式都要计算一次,这意味着非常复杂的表达式可能会引起性能问题,尤其是在执行同时影响大量行的运算(例如批量插入)的时候。
(2) 最有效率的哈希函数是只对单个表列进行计算,并且它的值随列值进行一致的增大或减小,因为这考虑了在分区范围上的“修剪”。也就是说,表达式值和它所基于的列的值变化越接近,就越能有效地使用该表达式来进行HASH分区。
31:线性HASH分区
线性HASH分区在“PARTITION BY”子句中添加“LINEAR”关键字。
线性HASH分区的有点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有及其大量数据的表。它的缺点在于各个分区间数据的分布不大可能均衡。
4 KEY分区
类似于HASH分区,HASH分区允许用户自定义的表达式,而KEY分区则不允许使用用户自定义的表达式;HASH分区只支持整数分区,KEY分区支持除了blob和text类型之外的其他数据类型分区。
与HASH分区不同,创建KEY分区表的时候,可以不指定分区键,默认会选择使用主键或唯一键作为分区键,没有主键或唯一键,就必须指定分区键。
解读:根据分区键来进行分区
5 子分区
子分区是分区表中,每个分区的再次分割,适合保存非常大量的数据。
解读:主分区使用RANGE按照年来进行分区,有3个RANGE分区。这3个分区中又被进一步分成了2个子分区,实际上,整个表被分成了3 2 = 6个分区。每个子分区按照天进行HASH分区。小于2017的放在一起,2017-2020的放在一起,大于2020的放在一起。
注意:
(1) 在MySQL51中,对于已经通过RANGE或LIST分区了的表在进行子分区是可能的。子分区既可以使用HASH分区,也可以使用KEY分区。这也被称为复合分区。
(2) 每个分区必须有相同数量的子分区。
(3) 如果在一个分区表上的任何分区上使用SUBPARTITION来明确定义任何子分区,那么就必须定义所有的子分区。
(4) 每个SUBPARTITION子句必须包含(至少)子分区的一个名字。
(5) 在每个子分区内,子分区的名字必须是惟一的,目前在整个表中,也要保持唯一。例如:
子分区可以用于特别大的表,可以在多个磁盘间分配数据和索引。例如:
九、MySQL分区处理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 如果希望能不丢失数据的条件下重新定义分区,可以使用如下语句:
REORGANIZE会对分区的数据进行重构。
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_schemapartitions 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
举例:
byte[] wswj = (byte[])dr["WSWJ"];//BitmapMetadataBlob
string str = SystemTextEncodingUnicodeGetString(wswj);
如果里面有WORD就会出现乱码。
1
blob是二进制大对象,可以容纳可变量数量的数据,其中blob分为4中类型:TINYBLOB,BLOB,mediumblob和LongBlob,他们容纳的长度是不同的
Text同样也分为四种类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT
2
blob被视为二进制字符串,Text被视为非二进制字符串;
blob列没有字符集,并且排序和比较基于列值字节的数值值。
TEXT列有一个字符集,并且根据字符集的校对规则对值进行排序和比较。
在MySQL TEXT或BLOB列的存储或检索过程中,不存在大小写转换,当未运行在严格模式时,如果你为BLOB或TEXT列分配一个超过该列类型的最大长度的值值,值被截取以保证适合。如果截掉的字符不是空格,将会产生一条警告。
使用严格SQL模式,会产生错误,并且值将被拒绝而不是截取并给出警告在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列。同样,可以将TEXT列视为VARCHAR列。
3
BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR
BLOB和TEXT列不能有默认值
当保存或检索BLOB和TEXT列的值时不删除尾部空格。(这与VARBINARY和VARCHAR列相同)
对于BLOB和TEXT列的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的
LONG和LONG VARCHAR对应MEDIUMTEXT数据类型。这是为了保证兼容性。如果TEXT列类型使用BINARY属性,将为列分配列字符集的二元校对规则
MySQL连接程序/ODBC将BLOB值定义为LONGVARBINARY,将MySQL TEXT值定义为LONGVARCHAR。由于BLOB和TEXT值可能会非常长,使用它们时可能遇到一些约束
BLOB或TEXT对象的最大大小由其类型确定,但在客户端和服务器之间实际可以传递的最大值由可用内存数量和通信缓存区大小确定。你可以通过更改
max_allowed_packet变量的值更改消息缓存区的大小,但必须同时修改服务器和客户端程序。例如,可以使用
MySQL和MySQLdump来更改客户端的max_allowed_packet值
以上就是关于mysql数据类型中blob和binary的区别全部的内容,包括:mysql数据类型中blob和binary的区别、MySQL字段类型都是什么意思、MySQL优化之数据类型的使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)