MYSQL索引查询问题质疑

本文介绍了MySQL查询中关于索引的一些常见问题及其解答。包括LIKE操作符、空值索引、函数计算与索引、类型不一致的查询、联合索引的使用以及!=和<>操作符的影响。强调了MySQL优化器的角色,如何根据基数分析选择最佳查询路径。此外,还提到了表关联的选择、UNION替代OR查询以及EXISTS与IN的性能对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

我们在写mysql查询语句的时候,尤其是经验不足的同学肯定会想要怎么使用索引加快查询,或是我这样写到底会不会命中索引。那么现在我就列举几个常见的索引查询问题进行简单说明一下。(欢迎互怼!)

1.问:使用like会不会走索引

答:使用like走索引,只是模糊查%不能位于左边,这样索引表不知道你现在要查什么数据

在这里插入图片描述

2.问:索引列能不能为空

答:使用 is not null不走索引,并且如果索引列大量数据为空,也没必要建立索引。

在这里插入图片描述

3. 问:索引函数计算会不会走索引

答:索引列使用函数计算会走索引,可是如果select 不是查询单纯的总数的话,就会进行全表扫描,就不会走索引。
如果索引列不用函数计算,单纯的用大于小于的话,会走索引

在这里插入图片描述

4.问:索引列查询类型跟字段类型不一致会不会走索引

答:会,因为mysql优化器会对查询语句进行优化,所以会走索引

在这里插入图片描述

5.问:建立联合索引,顺序反了会不会走索引(从左自右命中)

只要保证命中(包含)联合索引最左边一个字段,就能命中该联合索引。
如果你的查询项没有包含索引最左边的字段,mysql不知道你要走哪个索引,所以没办法命中。

>

6.问:!=和<>会不会走所有

没有绝对的概念
1.在使用主键!=会走索引
2.在使用其他列并且查询的是总数的时候!=会走索引
3.在使用其他列并且查询是*的时候,不走索引,例如用户姓名,假设200w数据,有199.99万用户都不等于这个姓名,那mysql会觉得你没有必要走索引,不如进行全表扫描。

在这里插入图片描述

小结

所以这就是mysql优化器的作用,会对索引表不断地进行分析,通过不断分析计算每个索引的一个基数,基数越大说明这个索引列的差异度越大,基数越小说明这个索引的差异度越小。

在这里插入图片描述


7. 表关联的时候是大表关联小表还是小表关联大表呢

还是那句话,这种事情mysql优化器会帮我们进行考虑,所以不用纠结写sql语句的时候该怎么去关联表,因为mysql优化器已经收集到了所有的数据,并且会不停的进行分析,所以它已经很聪明了。

在这里插入图片描述

8.如果数据量特别大,可以将单条查询语句拆为两条,通过union来进行拼接,替代or进行查询

在这里插入图片描述

9.EXISTS 和 in的性能比较

  • 子查询结果少,或者子查询是常量,用in

  • 子查询结果过多,用exists

  • exists的原理就是遍历主查询结果集,然后一条条记录跟子查询条件进行比较。
    in的原理就是先进行子查询,然后再扫描主查询表,再进行匹配

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Romeo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值