在MySQL中,使用LIKE进行模糊匹配查询时,如果匹配模式以通配符%开头,就可能导致索引失效。那么原因是什么呢?我们知道Mysql储存数据时采用B+树。
(1)当%号在左的时候,是匹配字符串尾部的数据,由于尾部的数据是没有数据的,所以不能按照索引的顺序查询,就用不到索引,就会使索引失效。
(2)当%号在右的时候,由于B+树的索引顺序,是按照首字母的大小进行排序,%号在右的匹配又是匹配首字母,所以可以在B+树上进行有序的查找,可以用到索引,
(3)当首尾都有%的时候,这个是查询任意位置的字母满足条件即可,只有首字母是进行索引排序的,其他位置都是相对无序的,索引此时也是用不到索引的。
举例说明:
下面建一个表test_msg1,添加两个数据项,如图
此时我们建立索引name,%在前执行查询,如图:
此时我们发现没有用到索引的,当%在右的时候,如图
此时发现可以用到索引,当我们将左右两边都加上%,如图:
那么我们如何%在前的时候使用索引呢,这个时候我们就需要采用覆盖索引,覆盖索引,顾名思义,覆盖索引是select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖,此时我们将我们需要所有的字段建成一个索引,比如我们查询字段user_id,name,将这两个字段建立成覆盖索引,此时测试,发现%在前也可以正常使用索引。
总结:使用覆盖索引可解决like索引失效的问题。