mysql按照索引字段查询,为何全表扫描?

发布于 2022-09-11 19:47:42 字数 643 浏览 16 评论 0

一个表,有一个isdel字段,标识此条数据是否删除,在此字段建立索引。

此字段类型为tinyint,默认值为0。

alter table table_name add index table_name_isdel(isdel);

sql为

select * from  table_name where isdel = 0;

explain结果为

clipboard.png

sql为

select * from  table_name where isdel = 1;

explain结果为:

clipboard.png

两个sql的区别只有isdel的条件值不同,但是为何explain结果不同呢?

另外,isdel=0的情况为多数,为1的情况为少数,是否这个原因导致的?如果是,如何解决呢?

感激不尽!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

山田美奈子 2022-09-18 19:47:42

这个是因为mysql内部的优化机制引起的
当查询需要访问绝大部分记录时,mysql会使用全表扫描而不是索引,因为查询索引也是需要时间的
根据你的描述,你的数据表中大部分的记录isdel=0,所以mysql认为全表扫描优于使用索引
跟楼上提到的一样
另外,不建议滥用索引,过度的使用索引反而会导致性能降低
应该为维度高的列创建索引,类似性别这种低纬度的列不适合使用索引

倦话 2022-09-18 19:47:42

你的数据一共多少行? 数据量太多或太少都有可能不使用索引

Indexes are less important for queries on small tables, or big tables where report queries process most or all of the rows. When a query needs to access most of the rows, reading sequentially is faster than working through an index. Sequential reads minimize disk seeks, even if not all the rows are needed for the query.

参考: https://dev.mysql.com/doc/ref...

我们只是彼此的过ke 2022-09-18 19:47:42

另外,isdel=0的情况为多数,为1的情况为少数,是否这个原因导致的?如果是,如何解决呢?
是这个原因;
不需要解决;
isdel=0走全表扫描优于索引扫描。

晚风撩人 2022-09-18 19:47:42

是因为innodb 内部决定的,当你使用二级索引进行查询,并且还不是一个覆盖索引。当使用索引查询之后筛选的数据过少的话,会变为主键索引的方式也就是全表扫描。因为二级索引查询的原理是,先根据条件查询到id,然后在回表。 根据id进行回表查询是随机读取的。磁盘的顺序读取比随机读取是要快的多的。所以优化器会通过主键索引来读取数据,顺序度比随机度要快的多。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文