MySql 前缀索引

create by:关彦明
create time:2016-05-24
-------------------------------------------------------------------------
前缀索引长度的可选择性
温故而知新,上班前几分钟,拿起新买的【高性能MySQL】一书,随手翻看,是一段讲前缀索引的,
之前的记忆里,只有用到列索引,没有用过前缀索引,前缀到底要建多长才合适呢?在什么场景下适用呢?带着问题继续看。
长度是可以根据现有数据计算出来的,计算SQL1:
SELECT COUNT(DISTINCT colName)/COUNT(*) FROM tableName
再用查询语句2计算值对比值:
SELECT COUNT(DISTINCT LEFT(colName,5))/COUNT(*) FROM tableName
可以多次修改变量“5”来执行计算出最接近SQL1计算的值,那么这个变量就是前缀索引长度可选择性最佳值

创建前缀索引:
ALTER TABLE tableName ADD KEY (colName(7))
-- 这里的7是通过计算得来的长度
前缀索引的好处:
使索引更小,执行更快

前缀索引的缺点:
无法使用前缀索引做GROUP BY和ORDER BY,也无法使用前缀索引做覆盖扫描。
 
前缀索引应用场景:
1、在一个32位长度字符串ID列上使用8到16位长度的前缀索引,能显著提升性能。
2、后缀索引,MySql里不支持后缀索引,但我们可以反转存储再使用前缀索引,比如查找某个域名的邮件地址(如*@163.com)
 
计算转义的列名:
今天才知道MySql计算列转义后的列名可以用在GROUP BY、HAVING、ORDER BY里,如:
SELECT LEFT(colName,7) AS newName, COUNT(0) AS amount
FROM tableName GROUP BY newName  HAVING amount > 1 ORDER BY  amount DESC , newName ASC
转义后的newName,可以在GROUP BY里引用,也可以在ORDER BY里引用
而在SQL Server中 是不能这么写的,只能GROUP BY LEFT(colName,7),以前使用SQL Server多,现在用MySql,
所以很多SQL习惯还是SQL Server的写法,特性的使用还得再深入啊,要不然性能低下还少了好多乐趣。
 
转载请注明原文地址:http://www.cnblogs.com/guanym/p/5522368.html                       
原文地址:https://www.cnblogs.com/guanym/p/5522368.html