【发布时间】:2020-02-20 23:21:29
【问题描述】:
我有一个 users 表,其中包含以下列:id(主键)、type、external_id、external_type、created_at、updated_at
索引:
- 主要
(id) - 独特的
(external_id, external_type, type) - 非唯一
(updated_at)
还有一个设置表,其中包含以下列:id、user_id、name、value、created_at、updated_at、type
索引:
- 主要
(id) - 独特的
(user_id, name) - 非唯一
(user_id) - 非唯一
(updated_at)
我执行查询:
SELECT users.id, users.type, users.external_id, users.created_at, users.updated_at,
settings.id, settings.settings_id, settings.name, settings.value,
settings.created_at, settings.updated_at, settings.type
FROM users
LEFT OUTER JOIN settings on settings.user_id = users.id
WHERE users.external_id=3 and users.external_type=“Owner”
在解释报告中,我看到:
- 对于 users 表,(external_id, external_type, type) 索引被标识为可能的键,但没有使用
- 设置表使用 (user_id, name) 索引
目标
- 我想优化这个查询
- 所以我想让 users 表使用 (external_id, external_type, type) 复合索引
我为调试所做的事情:
- 如果我更改 SELECT 语句的第一行以删除 users.created_at、users.updated_at,它使用索引
- 如果我尝试向 users 表添加 (external_id, external_type) 非唯一索引,它仍然不使用它
- 如果我将查询的 WHERE 子句更改为添加且 users.type=“Blah”,它将使用索引
我错过了什么?
【问题讨论】:
-
您的查询和表定义不一致。该查询的外部字段来自
settings而不是users。 -
什么版本的 MySQL?
-
请提供
SHOW CREATE TABLE;可能存在整理或其他问题。
标签: mysql sql indexing query-optimization database-indexes