不是所有针对索引列的查询都能用上索引

tech2022-09-15  76

是不是建了索引一定可以用上?

并不是

1、索引只能匹配列前缀 SELECT * FROM person WHERE NAME LIKE '%name123' LIMIT 100

因为索引只能前缀匹配,像这样的like 匹配后缀,name列的索引是不生效的。

2、设计函数操作无法走索引 SELECT * FROM person WHERE LENGTH(NAME)=7

建立的索引是name列,但搜索条件用到了Length函数,无法走索引。因为索引保存的是索引列的原始值,如果需要针对函数走数据库索引,需要保存一份函数变换后的值。

3、联合索引只能匹配左边的列 假如对name和score建立了联合索引name_score,name在前,score在后,而查找的时候只通过score查,也是不能走索引的。如: SELECT * FROM person WHERE SCORE > 45678

因为联合索引的顺序是先按照name排序,再按照score排序,单单score是无序的。

怎么选择建立联合索引还是独立索引?

1、如果你的索引经常会使用多个字段进行索引,可以考虑对这几个字段建立联合索引 2、同时,针对联合索引,使用索引覆盖的概率就较大。(索引覆盖,参见:https://blog.csdn.net/weixin_37968613/article/details/108355215) 3、如果只会查询单个字段,考虑建立独立索引。联合索引占用的空间相对较大

最新回复(0)