Mysql索引问题
最近面试,碰到几家都有问数据库索引失效的场景,发现的面试官说的都有点不一样,网上查到的结果也有差异,应该跟数据库版本有关系吧。在这里用MySQL8.x做个测试并记录一下。
首先 插入10w条数据
1 | --MySQL插入10w数据 |
MySQL版本8.0.17,索引信息如下:
INDEX
idx_user_id_product_id_
out_trade_no(
user_id,
product_id,
out_trade_no`)随便选三个字段建立复合
INDEX
idx_goods_order_no
(goods_order_no
)建一个普通索引
1.最佳左前缀
1 | --索引生效 |
只要查询条件包含复合索引最左侧的列即可,与顺序无关,数据库执行引擎会帮我们做优化。
2.范围查询
1 | --索引无效 |
如果对复合索引最左侧的列进行范围查询,那么索引就会失效
3 Like模糊查询
1 | --不走索引 |
只有普通索引,在%号在后边才会生效。复合索引like查询无效。
4 is not null、 is null
1 | --索引无效 |
is not null 索引失效
5 in和not in
1 | --Using index condition |
in 查询执行计划Extra Using index condition,而not in 索引失效
6 != 、<、>、between and
1 | --Using index condition |
尽量不要使用这些条件。有些情况下会导致索引无效(可能跟匹配行有关系)
7 对索引加函数或者运算
1 | ---索引不生效 |
索引列如果做任何函数运算,索引就会失效
8 索引列类型不匹配
1 | --索引不生效 |
查询条件值类型要和数据库匹配,否则索引失效
9 or
1 | ---索引无效 |
只有查询条件字段都存在索引时,索引才可能会生效。否则只要出现or,索引就会失效