什么是前缀索引

  我们吃甘蔗的时候,若出现虫蛀情况,我们不能判断虫蛀的范围有大,如果为了省事,直接砍去若干节,虫蛀残留的概率就会小很多,但是很可能损失更多的可食用甘蔗。如果一点点地削,直至虫蛀不再出现为止,看起来多花了点功夫,但是浪费的少,也只值得。

  相比于砍甘蔗,MySQL 的全文索引类似于第一种方法,前缀索引则像是第二种方法。

  当需要以某个数据类型是字符串的列为索引时,通常都是创建全文索引,通过全文匹配条件来筛选记录。其实没有必要,一种更好的办法是:

可以索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率

为什么要使用前缀索引

  • 大大节约索引空间,从而提高索引效率
  • 对于 BOLBTEXT 或者很长的 VARCHAR

索引的选择性

  也许我们心中已经留下了前缀索引效率高于全文索引的印象,但是前缀的长度该保留多少呢?有没有一个标准的值呢?换句话说,索引的长度与查询效率之间呈现怎样的关系?

  首先,引入一个概念——索引的选择性:

不重复的索引值(也称基数)和数据表记录总数(#T)的值,范围从 1 / #T

  索引的选择性越高则查询效率越高,因为选择性高的索引可以让 MySQL 在查找时过滤掉更多的行。对比之下,唯一索引(值唯一,比如主键)的选择性是 1,这是最好的索引选择性,性能也是最好的。

T,但是比起这些缺点,前缀索引的好处简直是大过天。

要选择足够长的前缀以保证较高的选择性,同时又不能太长。前缀的长度应该使前缀索引的选择性接近索引整个列,即前缀的“基数”应该接近于完整列的“基数”。

举例说明

  下面的例子,查询软件名称,并统计其数量


统计 #T

T,现在要查找到最频繁出现(基数接近 #T )的软件名称前缀,直接从 7


前缀长度为 7 索引

9


前缀长度为 9 索引

10,和 9 差不多,最后,选择了前缀长度为 9