我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

关于 MySQL 中的 in 和 in 是否使用索引的问题——具体情况取决于优化器的决定,但一般的规则是: in 和 in 的数据比例越大,它越有可能不使用索引。例如,如果我 in 中有十几条数据,它就会使用索引。

1. MySQL 会使用索引吗?

不一定,视情况而定,MySQL 优化器内部会决定是否执行全表扫描或索引搜索,使用更有效的方法。

当索引字段的唯一性不高(索引的“区分度”较低)时,优化器可能会选择扫描全表,而不是使用索引。这可能是因为相等值查询满足条件的记录太多,导致 MySQL 认为全表扫描比使用索引查找值更快。

例如,如果你对一个不是非常独特的字段(如性别:男/女)加了索引,那么你可能需要回表通过索引来查找,还不如直接扫描全表呢!

如果in中的数据量很大的话,索引基本就不会用到,如果你的索引字段就一个,in可能会用到索引。

如果必须使用索引,可以使用强制索引。也可能和MySQL版本有关(在5.6之后已经做了查询优化)。

注意:如果是5.5之前的版本,索引不会被使用。在5.5之后的版本中,MySQL做了优化。在2010年发布的MySQL 5.5版本中,优化器可以自动优化in操作符。对于有索引的列可以使用索引,没有索引的列仍然会进行全表扫描。

2. MySQL 会使用索引吗?

不一定,视情况而定。是否使用索引取决于优化器的评估。即使连接条件设置了索引,也可能由于表返回而导致索引失效。

索引优化器的目的是找到一种方案,使得执行语句时索引扫描的行数最少。那么扫描行数是怎么确定的呢?是不是通过逐行统计统计表中的数据来算呢?其实并不是的。而是根据统计信息得出的一个预估值。这个统计信息就是我们常说的索引的“判别力”。

显然,索引的不同值越多,索引的区分度就越好。我们把索引上不同值的数量称为“索引基数”。换句话说,基数越大,索引的区分度就越好,执行查询的行数就越少。如何查看索引基数?使用 show index from 表名,其中字段显示索引基数。

扩展:MySQL如何获取索引基数?不感兴趣的可以跳过此文。

索引基数 = 抽样统计 * 页数。抽样统计是为了避免拿出整个表逐行统计进行精确计算,以免消耗系统性能。抽样统计时会默认选取 N 个数据页,统计这些页上“对应索引字段”上的不同值的数量,取一个平均值,再将平均值乘以这个索引的页数,就得到了这个索引的基数。统计信息并不是固定的,会随着数据表的变化而变化,当变化的数据行数超过 1/M 时,就会自动触发新的索引统计。

建议:使用前最好先尝试一下SQL语句是否使用了索引,然后选择更优的SQL。

3. 总结

测试分为三种情况:

情况 1:and 或 中的列是主键

第二种情况:当 和 或 所在的列已创建索引时

第二种情况:and或所在的列没有索引

最终结论如下:

1、当字段被索引后,查询速度非常快,in和or查询速度没有区别。

2、当字段没有加索引时,连接的字段越多(......),or的查询效率比in的低。

我在这里也找到了一些答案,典型的如下:

索引使用方法_索引使用原则_mysql in 使用索引

有人做过实验,通过比较,发现In的效率更高。

还有这个答案:据说是引用自《高性能MySQL》

索引使用原则_索引使用方法_mysql in 使用索引

粗略翻译一下,意思是:

在很多数据库中,In 和 or 是等价的,因为逻辑上等价。但是在 MySQL 中,in 中的列表是经过排序的,排序时采用二分查找的方式判断是否在列表中。in 的时间复杂度为 O(logn),而 or 的时间复杂度为 O(n),也就是说 In 的效率更高。

有些人还说范围搜索比范围搜索更有效。

官方文档

地址:#

索引使用原则_索引使用方法_mysql in 使用索引

回顾一下:列表中的值已排序,并且使用二分搜索来完成对 expr 的搜索,这使得 IN() 操作非常快。

可以看到官方文档和上面的解释非常相似,并且非常高效。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/5276.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线