8.选择合适的数据类型
8.1 CHAR与VARCHAR
CHAR固定长度的字符类型,char(n) 当输入长度不足n时将用空格补齐,char(n)占用n个字节,CHAR类型输出时会截断尾部的空格,即使是数据值尾部的空格也将会被截断。CHAR处理速度要快于VARCHAR。
VARCHAR可变长度的字符类型,varchar(n) 当输入长度不足n时不用补齐,varchar(n)占用实际长度+1个字节,+1个字节是因为VARCHAR值后需要加一个字符串结尾符。VARCHAR类型输出时会截断字符串结尾符。
不同存储引擎下CHAR与VARCHAR的选择:
MyISAM存储引擎建议使用CHAR;
MEMORY存储引擎使用固定长度的数据行存储,即使列定义为VARCHAR也会被作为CHAR处理;
InnoDB存储引擎建议使用VARCHAR,所有行都有头部指针。
8.2 TEXT和BLOB
TEXT和BLOB用于保存大文本,其中:TEXT类型用来保存字符数据,BLOB类型用来保存二进制数据。
TEXT和BLOB的性能考虑:
1.optimize table
在删除数据后或者将数据由大改小后,数据将被删除,但空间并不会释放,这些在表的数据文件内未释放的空间称为碎片,碎片对表的性能会产生影响。
optimize table命令可以整理磁盘空间,并释放碎片。
例子:
create table test10 (id varchar(100),content text);
insert into test10 values ('1',repeat('abc',100)); -- repeat()函数是循环
insert into test10 values ('2',repeat('bcd',100));
insert into test10 values ('3',repeat('cde',100));
-- 查看数据文件 C:Program FilesMySQLDataDatascott est10.ibd 96k
delete from test10 where id=1;
-- 查看数据文件
optimize table test10; -- 'Table does not support optimize, doing recreate + analyze instead'
-- 查看数据文件
2.合成索引
使用合成索引来提高大文本字段的查询性能。
合成索引是指根据大文本字段的内容建立一个散列值,并单独存储散列值,以散列值来查询数据行。
注意:只能用于散列值的精确匹配,不能用于范围匹配。
可以生成散列值的函数包括md5(),sha1(),crc32()等。
例子:
create table test11(id varchar(100),context blob,hash_value varchar(40));
insert into test11 values (1,repeat('beijing',100),md5(context));
insert into test11 values (2,repeat('shanghai',100),md5(context));
insert into test11 values (3,repeat('guangzhou',100),md5(context));
select * from test11;
explain select * from test11 where hash_value=md5(repeat('guangzhou',100));
3.前缀索引
-- 对context列前100个字符建立索引
create index idx_blob on test11(context(100));
-- 查看执行计划,前缀索引被查询使用
explain select * from test11 where context like 'guangzhou%';
4.避免select *
如果不需要返回TEXT和BLOB列时,则避免使用select *,以减少网络传输的数据量。
5.将TEXT和BLOB列拆表
把TEXT和BLOB列分离到单独的表中,适用于对其他列使用频繁,对TEXT和BLOB列使用不频繁的情况下。
8.3 浮点数和定点数
浮点数用于存储含小数的数值,包括float和double,浮点数精度较低(float 6位,double 15位),超出有效位数将导致四舍五入。
定点数以字符串存储,数据类型为decimal(65,0~30),超出定义精度时,在SQLMode模式下会警告并四舍五入,在TRADITIONAL模式下报错无法插入。
精度要求较高时建议选择定点数decimal(65,0~30)。
8.4 日期类型选择
根据实际需要选择能够满足应用的最小存储的日期类型;
只存年,用year;
只存年月日,用date;
只存时分秒,用time;
存年月日时分秒,用datetime,
跨不同时区使用,用timestamp。
8.5 小结