一. 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值。這是由於單精度浮點數表示時產生了誤差,在精度要求高的應用中(比如貨幣)要使用定點數。