mysql - 在 where 和 orderby 子句中使用两个单列索引
问题描述
我用谷歌搜索了很多,找不到我的问题的明确答案
假设我们有这个查询
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
操作变为无操作。
我注意到您正在使用select *
; 一般来说,这不是一个好习惯,也不利于性能。如果表中除了用户和日期之外还有其他列,这会迫使数据库在通过索引过滤和排序后查找表以带来相应的行,这可能比根本不使用索引更昂贵。如果您只需要几列,请枚举它们:
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)
. 那是一个覆盖索引:数据库可以使用索引执行整个查询,而无需查找表本身。
推荐阅读
- asp.net-core - DI 范围的范围是什么 - .NET Core 中的 Hangfire
- websphere - WASSessionCor W SessionAffinityManager setCookie SESN0066E: 响应已提交给客户机。无法设置会话 cookie
- python-3.x - 在 Mac OS X Catalina 中找不到“/Library/Python/3.7m/include/pyconfig.h”?
- c# - 在 SignalR 聊天应用中上传媒体时断开连接
- python - 带 Telepot 的 Klling 线程
- couchbase - 在 cbrestore 工具的沙发库中找不到 cbb 备份路径
- flutter - Flutter Doctor 代理检测
- postgresql - 为什么在没有查询的情况下记录持续时间?
- r - 将属性(性别)添加到边缘列表中的顶点
- python - 获取 Pandas DataFrame 中列括号之间的文本