在 where 和 orderby 子句中使用两个单列索引

Using two single-column indexes in where and orderby clause

我用谷歌搜索了很多,但找不到我的问题的明确答案

假设我们有这个查询

SELECT * WHERE user_id = x ORDER BY date_created

如果我们在 user_id 上有一个列索引,在 date_created 上有另一个列索引,优化器会同时使用这两个索引吗?或者只是 user_id 索引?

这是您的查询:

SELECT *
FROM mytable
WHERE user_id = 123 
ORDER BY date_created

如果您有两个不同的索引,那么 MySQL 可能会使用 user_id 上的索引来应用 where 谓词(如果它认为它会加快查询速度,具体取决于关于数据的基数和其他因素)。它不会使用 date_created 上的索引,因为它无法将满足 where 谓词的中间结果集与该索引相关联。

对于此查询,您需要 (user_id, date_created) 上的 复合索引 。数据库使用索引中的第一个键来过滤数据集:在索引 B-tree 中,匹配行已经按日期排序,因此 order by 操作变为 no-op.

我注意到您正在使用 select *;这通常不是一个好的做法,也不利于性能。如果 table 中除了用户和日期之外还有其他列,这会强制数据库查找 table 以在 过滤和 之后带来相应的行通过索引排序,这可能比根本不使用索引更昂贵。如果你只需要几列,那么枚举它们:

SELECT date_created, first_name, last_name 
FROM mytable
WHERE user_id = 123 
ORDER BY date_created

并且在 (user_id, date_created, first_name, last_name) 上有一个索引。这是一个 covering 索引:数据库可以在索引上执行 whole 查询,而无需查找 table 本身。