索引失效快速记忆
索引失效快速记忆
索引在平时数据库使用中会被我们经常用到,索引在查询的时候使用不当,这会严重影响到我们服务器数据查询的性能,那么索引失效的原因有哪些啦?如何能够快速记忆?
有一个口诀:[模型函][空运][最快],下面将分别介绍每个字背后的意义。
模(模糊查询):like的模糊查询以%开头,索引失效。比如:SELECT * FROM `room_info` WHERE `room_name` LIKE '%1-10%';
型(数据类型不匹配):类型错误,如字段类型为varchar,where条件后的用number,索引也会失效。比如:SELECT * FROM `room_info` WHERE room_no= 101; room_no房间编号为varchar类型,查询使用integer类型导致索引失效。
函(查询索引字段使用函数):对索引的字段使用内部函数,索引也会失效。这种情况下应该建立基于函数的索引。比如:SELECT * FROM `room_info` WHERE DATE(create_time) = '2020-09-03';create_time字段设置索引,那就无法使用函数,否则索引失效。
空(查询索引字段值为Null值):索引不应该存储空值,如果不限制索引列是not null,数据库会认为索引列有可能存在空值,所以不会按照索引进行计算。
比如:
SELECT * FROM `room_info` WHERE address IS NULL;不走索引。
SELECT * FROM `room_info` WHERE address IS NOT NULL;走索引。
建议大家这设计字段的时候,如果没有必要的要求必须为NULL,那么最好给个默认值空字符串(或者默认值),这可以解决很多后续的麻烦(切记)。
运(对查询字段进行运算):对索引列进行(+,-,*,/,!, !=, <>)等运算,会导致索引失效。比如:SELECT * FROM `room_owner` WHERE age - 1 = 20;
最(不遵循最左匹配原则):在复合索引中索引列的顺序至关重要。如果不是按照索引的最左列开始查找,则无法使用索引。
快(全表扫描比走索引速度更快):如果数据库预计使用全表扫描要比使用索引快,则不使用索引。
说明:以上索引失效的口诀主要是针对关系型数据库,newSQL数据库如TIDB、OceanBase等需要根据自身索引要求单独研究。