现在的位置: 首页 > 综合 > 正文

MySQL数据类型与架构优化

2013年10月07日 ⁄ 综合 ⁄ 共 2380字 ⁄ 字号 评论关闭

MySQL选择优化的数据类型
更小的通常更好
:尽量使用可以正确存储数据的最小数据类型。更小的数据类型通常更快,因为他们占用更少的的磁盘、内存和CPU缓存,并且处理时需要的CPU周期更少。
简单就好:简单的数据类型的操作通常需要更少的CPU周期。例如,整形比字符串操作代价低;使用MySQL内建的类型(date,time,datetime)存储日期和时间,而不是字符串;使用整形存储IP地址。
避免使用NULL:通常情况下最好指定列为NOT NULL。如果查询中包含可为NULL的列,对于MySQL来说更难优化。可为NULL的列使得索引、索引统计和值的比较都更复杂。可为NULL的列会使用更多的存储空间,在MySQL里也需要特殊处理。可为NULL的列被索引时,每个索引记录需要一个额外的字节。如果在列上建立索引,应该尽量避免设计成可为NULL的列。
为列选择数据类型时,首先需要确实合适的大类型:数字、字符串、时间等;下一步确定具体类型,MySQL很多数据类型可以存储相同的数据,只是存储的长度和范围不一样、允许的精度不同,或者需要的物理空间(磁盘和内存空间)不同。

数值类型:
1)BIT,默认1bit,最大可以为64bit
mysql>create table bittest(a bit(8));
mysql>insert into bittest values(b'00111001')

2)BOOL,BOOLEAN。TINYINT(1)的同义词。
3)整数(whole number)和实数(real number)
整数类型:TINYINT(8bit)、SMALLINT(16bit)、MEDIUMINT(24bit)、INT(32bit)、BIGINT(64bit)。存储范围:-2^(N-1) 到2^(N-1)-1。整数有可选的UNSIGNED属性。
MYSQL可以为整数指定宽度,如INT(11),对于大多数应用没有意义,只是规定了MySQL的一些交互工具(如MySQL命令行客户端)用来显示字符的个数。

实数:
Fixed-Point Type
(定点类型,精确值):DECIMAL,NUMERIC
NUMERIC被实现为DECIMAL,MYSQL用二进制形式存储DECIMAL。
DECIMAL可以指定小数的精度(precision,总的位数)和小数点后面的位数(scale)
DECIMAL(5,2)可以表示的数字范围大小为:-999.99~999.99

Float-Point Type (浮点类型,近似值): Float,DOUBLE
FLOAT(4Byte)、DOUBLE (8Byte)
MySQL支持可选的精度指定,精度值也确定了数字的存储空间的大小,精度为0~23时使用4Byte的单精度FlOAT,精度为24~52时使用*8Byte的双精度DOUBLE。
MySQL允许非标准的语法,MySQL permits a nonstandard syntax: FLOAT(M,D) or REAL(M,D) or DOUBLE PRECISION(M,D). “(M,D)” means than values can be stored with up to M digits in total, of which D digits may be after the decimal point.M表示总数字总的位数,D表示小数点后面的位数。
MySQL将数字打包保存到一个二进制字符串中,(每4个字节Bytes存9个数字)。例如,DECIMAL(18,9)小数点两边个存储9个数字,小数点本身占用一个字节,一共使用9个字节。

日期和时间类型
DATE :日期,没有时间部分
TIME :时间,没有日期部分
DATETIME: 使用8个字节存储空间。DATETIME值的表示形式为'YYYY-MM-DD HH:MM:SS',表示的时间范围为:'1000-01-01 00:00:00' to '9999-12-31 23:59:59'.
TIMESTAMP:使用4个字节存储空间,和Unix时间戳项同,保存了从1970年1月1日午夜(格林尼治标准时间)以来的秒数。表示的时间范围为:'1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC.
YEAR:年份

字符串
VARCHAR
:可变长字符串,需要使用1或2个额外的字节记录字符串的长度。一下情况使用VARCHAR比较合适,字符串列的最大长度比平均长度大很多;列的更新很少,所以碎片不是问题;使用像UTF-8这样复杂的字符集,每个字符使用不同的字节数进行存储。
CHAR:MySQL总是根据定义的字符串长度分配足够的空间。
BLOBTEXT:为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。他们分别属于不同的数据类型家族:
二进制类型:TINYBLOB、SMALLBLOB、BLOB、MEDIUMBLOB、LONGBLOB;BLOB是SMALLBLOB的同义词
   字符类型:TINYTEXT、SMALLTEXT、TEXT、MEDIUMTEXT、LONGTEXT;TEXT是SMALLTEXT的同义词
MySQL把BLOB和TEXT值当作一个独立的处理对象,存储引擎在存储时通常会做特殊处理。当BLOB和TEXT值太大时,InnoDB会使用专门的外部存储区域进行存储,此时每个值在行内需要1~4个字节存储一个指针,然后在外部存储区域存储实际的值。
BINARY:二进制字符串,存储的是字节码。BINARY填充的是\0(零字节)而不是空格。
VARBINARY:二进制字符串,存储的是字节码。
ENUM:枚举类型

SET:如果需要保存很多true/false值,可以合并这些列到一个SET数据类型。


参考资料:

高性能MySQL(第三版)

MySQL5.6参考手册:MySQL Reference Manual

   

抱歉!评论已关闭.