我得到一个复杂的查询:
SELECT * FROM
(
SELECT Transaction
FROM table1
WHERE
Transaction IN (SELECT Transaction FROM table2 WHERE Plugin='XXX' AND Server='XXX')
AND
Transaction NOT IN (SELECT Transaction FROM table1 WHERE Detail IN ('Monitor','Version','monitor','version'))
ORDER BY Date DESC, Millisecond DESC LIMIT 10)
AS res
我在 table1:Detail 上获取索引,“Transaction”是 table2
的主键。
数据库返回结果需要一段时间(5-10 秒)。所以我在 table2:Plugin 上创建了另一个索引,现在查询速度很快,但是准备状态出现并且也需要 5-10 秒。所以在我创建新索引后,时间根本没有改变。
谁能告诉我发生了什么事,我该如何优化这个查询?谢谢!
最佳答案
你能不能简单地重写查询如下:
SELECT a.Transaction
FROM table1 a
INNER JOIN table2 b ON b.Transaction = a.Transaction
WHERE (b.Plugin='XXX' AND b.Server='XXX')
AND a.Detail NOT IN ('Monitor','Version','monitor','version')
ORDER BY a.Date DESC, a.Millisecond DESC LIMIT 10
所以你加入 table2
(这会更快)并删除所有子查询。
这应该快得多。
关于mySQL 索引和准备状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18134737/