在 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 本身。
我用谷歌搜索了很多,但找不到我的问题的明确答案
假设我们有这个查询
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 本身。