欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mysql 开发基础系列13 选择合适的数据类型(下)

程序员文章站 2023-09-28 08:39:22
一. 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;

mysql 开发基础系列13 选择合适的数据类型(下)

--  查询context值为 beijing 2008的记录,通过散列值来查询
SELECT * FROM t WHERE hash_value=MD5(REPEAT('beijing 2008',2));

mysql 开发基础系列13 选择合适的数据类型(下)

  上面展示了合成索引的用法,这种技术只用于精确匹配,在一定程度上减少i/0,提高查询效率,如果要使用模糊查询,可以考虑使用前缀索引。

2. 前缀索引

--  创建前缀索引,为字段前N个字符创建索引。这里是前100个字符进行模糊查询
CREATE INDEX idx_blob ON  t(context(100))
-- 查看是否用到前缀索引
 DESC SELECT * FROM t WHERE context LIKE 'beiing%0'

mysql 开发基础系列13 选择合适的数据类型(下)

  总结: 可以考虑把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;

mysql 开发基础系列13 选择合适的数据类型(下)

  从上面的例子看出c1列插入131072.32值,实际变成了131072.31值。这是由于单精度浮点数表示时产生了误差,在精度要求高的应用中(比如货币)要使用定点数。