索引失效场景
- 如果条件中有
or
,即使其中有条件带索引也不会使用; - 使用
!=
对索引列进行判断,也会使索引失效; - 使用
is null
或者is not null
做判断,会使该列索引失效; - 对于联合索引,违背了最左匹配原则,会导致索引失效;
- like查询以%开头,会使索引失效;
- 如果列类型是字符串,那一定要在条件中将数据使用单引号引用起来,否则不使用索引;
- 在索引的列上使用表达式或者函数会使索引失效;
最左前缀匹配原则 是 MySQL 在使用联合索引时的规则。简单来说,查询条件必须从索引的最左边的列开始,不能跳过。如果跳过了某个左侧的列,MySQL 就不能使用这个索引来加速查询。
如何分析 SQL 语句是否走索引查询
可以使用 EXPLAIN
命令来分析 SQL 的 执行计划 ,这样就知道语句是否命中索引了。执行计划是指一条 SQL 语句在经过 MySQL 查询优化器的优化会后,具体的执行方式。
EXPLAIN
输出的一些重要字段包括:
- id:查询的唯一标识,帮助区分不同的查询操作。
- select_type:查询的类型,如简单查询、联合查询等。
- table:查询操作涉及的表。
- type :访问表的方式,如全表扫描、索引扫描等。。
index
:全索引扫描。range
:通过索引范围扫描。ref
:使用非唯一索引扫描。eq_ref
:使用唯一索引扫描,通常用于连接查询。const
、system
:表只有一行数据时,使用const
或system
。
- possible_keys:查询可能使用的索引。
- key:实际使用的索引。
- rows:扫描的行数,越少越好。