我正在使用MySQL 8。
我的问题是:
SELECT * FROM users WHERE status = 1 ORDER BY id相关的列和索引状态是:
id:主键(Indexed)status:索引我的问题是:
id和status都有索引。我还需要一个单独的复合索引(状态,id)吗?
发布于 2021-08-11 22:55:29
每个SELECT只能使用一个索引。因此,当不同的列都包含在一个SELECT中时,在不同的列上使用不同的索引不会有多大帮助。
在您的情况下,您可能希望在users (status, id)上尝试一个索引。使用EXPLAIN检查它是否被捡起来。
发布于 2021-08-11 23:48:16
如果您使用的是InnoDB,那么status上的辅助索引将隐式地附加主键。就好像您在(status, id)上有一个索引一样。
因此,您将选择具有给定值status=1的行,然后InnoDB将按索引顺序读取这些行,这意味着它们将由id按顺序返回。由于这与ORDER BY子句匹配,优化器知道它可以跳过对结果排序的任何工作。
您可以使用EXPLAIN来确认这一点。您要寻找的是,在EXPLAIN报告的额外字段中没有“使用文件”。
https://stackoverflow.com/questions/68749743
复制相似问题