mysql 开发基础系列13 选择合适的数据类型(下)
程序员文章站
2022-06-02 10:50:01
一. BloB和Text 1. 合成索引 合成索引可以提高大文本字段BLOB和Text的查询性能, 合成索引是在表中增加一个字段存放散列值,这种技术只能用于精确匹配的查询,可以使用md5()或sha1,crc23() 来生成散列值, 数值型散列值可以提高存储效率 。下面演示下 上面展示了合成索引的用 ......
一. BloB和Text
1. 合成索引
合成索引可以提高大文本字段BLOB和Text的查询性能, 合成索引是在表中增加一个字段存放散列值,这种技术只能用于精确匹配的查询,可以使用md5()或sha1,crc23() 来生成散列值, 数值型散列值可以提高存储效率 。下面演示下
-- hash_value字段用来存储散列值 CREATE TABLE t(id VARCHAR(100),context BLOB, hash_value VARCHAR(40)) -- 插入数据 存放MD5散列值 INSERT INTO t VALUES(1, REPEAT('beijing',2),MD5(context)); INSERT INTO t VALUES(2, REPEAT('beijing',2),MD5(context)); INSERT INTO t VALUES(3, REPEAT('beijing 2008',2),MD5(context)); SELECT * FROM t;
-- 查询context值为 beijing 2008的记录,通过散列值来查询 SELECT * FROM t WHERE hash_value=MD5(REPEAT('beijing 2008',2));
上面展示了合成索引的用法,这种技术只用于精确匹配,在一定程度上减少i/0,提高查询效率,如果要使用模糊查询,可以考虑使用前缀索引。
2. 前缀索引
-- 创建前缀索引,为字段前N个字符创建索引。这里是前100个字符进行模糊查询 CREATE INDEX idx_blob ON t(context(100)) -- 查看是否用到前缀索引 DESC SELECT * FROM t WHERE context LIKE 'beiing%0'
总结: 可以考虑把blob和text列移动到第二张数据表中,把原数据表的数据列转换为固定长度的数据行格式,减少碎片。
二. 浮点数与定点数
浮点数一般用于含有小数部分的数值,当数据的精度超过该列定义的实际精度时,则插入值被四舍五入到实际定义的精度值。在mysql中 float,double(或real)用来表示。
定点数则是以字符串形式存放的。当数据的精度超过该列定义的实际精度时,则mysql会警告(默认的sqlmode),但也是按照四舍五入。如果sqlmode 是在传统模式下则会报错,在mysql中 deciaml或(numberic)用来表示。
-- 下面看下浮点数与定点数的区别 CREATE TABLE test(c1 FLOAT(10,2),c2 DECIMAL(10,2)) INSERT INTO test VALUES(131072.32,131072.32) SELECT * FROM test;
从上面的例子看出c1列插入131072.32值,实际变成了131072.31值。这是由于单精度浮点数表示时产生了误差,在精度要求高的应用中(比如货币)要使用定点数。