我正在为我的高流量网站优化一个 mysql 表,我有一个关于 mysql 索引的问题。首先是一些信息:
该表有 273382 行。
查询是:
SELECT table1.field1, table1.field2, table2.field2
FROM table1
LEFT JOIN table2 ON table1.idfield = table2.idfield
WHERE table1.field = 1 AND table1.field2 = 'yes'
ORDER BY table1.id DESC
LIMIT 0,25
我有以下索引:
index for table1.id - primary unique index
index for table1.idfield - index
index for table2.idfield - index
index for (table1.field,table1.field2) - index
使用上述索引查询需要 1.5 到 2.5 秒才能完成
EXPLAIN EXTENDED 说它正在使用主键 (table1.id),我已经尝试过 unique/index (table1.field,table1.field2,table1.id) 并得到类似的结果(即使它正在使用这个索引) .
在索引更改过程中(大约需要 1 分钟),查询变得更快 0.009。更改过程完成后,查询速度将恢复为 1.5-2.5 秒(大部分低于 2 秒)。
我的问题是:哪个索引最适合此查询以及为什么在更改索引时查询速度如此之快。
最佳答案
如果超过大约 20% 的表具有 table1.field = 1 AND table1.field2 = 'yes'
,则优化器决定扫描表而不是反弹更便宜甚至在最佳索引 (field, field2, id)
和数据之间来回。
请提供SHOW CREATE TABLE
、SHOW TABLE STATUS
、EXPLAIN SELECT ...
、RAM 大小和innodb_buffer_pool_size
如果您想进一步讨论这个问题。
它闻起来像缓存和 I/O 问题;以上信息将有助于深入了解这一点。
关于MySQL索引最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40387785/