【发布时间】:2021-12-13 19:26:03
【问题描述】:
我正在使用 MySQL 5.6 并尝试优化下一个查询:
SELECT t1.field1,
...
t1.field30,
t2.field1
FROM Table1 t1
JOIN Table2 t2 ON t1.fk_int = t2.pk_int
WHERE t1.int_field = ?
AND t1.enum_filed != 'value'
ORDER BY t1.created_datetime desc;
一个响应可以包含数百万条记录,每行包含 31 列。
现在 EXPLAIN 在 Extra 中说规划器使用“使用位置”。
我尝试添加下一个索引:
create index test_idx ON Table1 (int_field, enum_filed, created_datetime, fk_int);
之后 EXPLAIN 在 Extra 中说计划器使用“使用索引条件;使用文件排序”
带有索引的 EXPLAIN 中的“rows”值小于没有它的值。但实际上执行时间更长。
所以,接下来的问题是:
- 此查询的最佳索引是什么?
- 为什么 EXPLAIN 说带有索引的查询的 'key_len' 是 5。不应该是 4+1+8+4=17 吗?
- ORDER BY 中的字段是否应该在索引中?
- JOIN 中的字段是否应该在索引中?
【问题讨论】:
-
什么是这个查询的最佳索引? 测试
(int_field, enum_filed, fk_int, created_datetime)和(int_field, fk_int, enum_filed, created_datetime)。 为什么 EXPLAIN 说带有索引的查询的 'key_len' 是 5。不应该是 4+1+8+4=17 吗? 只使用索引表达式中的前 2 列。 现在 EXPLAIN 在 Extra 中说计划器使用“使用位置” Filesort 也存在,但未提及。 -
MySQL 5.6 于 9 年前首次发布,到 2021 年 2 月结束生命周期,物有所值。如果您要投入大量工作来优化您的应用,最好使用当前版本的软件。
-
enum_filed有多少个不同的值? (如果您没有注意到,向您提出的几个问题可以通过提供SHOW CREATE TABLE来解决) -
当
INT显示为“5”时,提示可能它应该是NOT NULL。 -
@RickJames
enum_filed有 5 个不同的值。
标签: mysql sql indexing query-optimization