什么是前缀索引
我们吃甘蔗的时候,若出现虫蛀情况,我们不能判断虫蛀的范围有大,如果为了省事,直接砍去若干节,虫蛀残留的概率就会小很多,但是很可能损失更多的可食用甘蔗。如果一点点地削,直至虫蛀不再出现为止,看起来多花了点功夫,但是浪费的少,也只值得。
相比于砍甘蔗,MySQL 的全文索引类似于第一种方法,前缀索引则像是第二种方法。
当需要以某个数据类型是字符串的列为索引时,通常都是创建全文索引,通过全文匹配条件来筛选记录。其实没有必要,一种更好的办法是:
可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率
为什么要使用前缀索引
- 大大节约索引空间,从而提高索引效率
- 对于 BOLB、TEXT 或者很长的 VARCHAR
索引的选择性
也许我们心中已经留下了前缀索引效率高于全文索引的印象,但是前缀的长度该保留多少呢?有没有一个标准的值呢?换句话说,索引的长度与查询效率之间呈现怎样的关系?
首先,引入一个概念——索引的选择性:
不重复的索引值(也称基数)和数据表记录总数(#T)的值,范围从 1 / #T
索引的选择性越高则查询效率越高,因为选择性高的索引可以让 MySQL 在查找时过滤掉更多的行。对比之下,唯一索引(值唯一,比如主键)的选择性是 1,这是最好的索引选择性,性能也是最好的。
T,但是比起这些缺点,前缀索引的好处简直是大过天。
要选择足够长的前缀以保证较高的选择性,同时又不能太长。前缀的长度应该使前缀索引的选择性接近索引整个列,即前缀的“基数”应该接近于完整列的“基数”。
举例说明
下面的例子,查询软件名称,并统计其数量
统计 #T
T,现在要查找到最频繁出现(基数接近 #T )的软件名称前缀,直接从 7
前缀长度为 7 索引
9:
前缀长度为 9 索引
10,和 9 差不多,最后,选择了前缀长度为 9