mySQL 索引和准备状态

标签 mysql optimization indexing

我得到一个复杂的查询:

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/

相关文章:

mysql - 如何避免数据库中相同类型的列重复

mysql - 为什么在将 Grails WAR 部署到 Tomcat 时出现 H2 错误

optimization - 流多处理器,cuda 中每个流处理器的核心

Java 字符串函数

python - 如何使用索引更新张量的元素?

php - 如何在一个循环中获取包含正确结果值的 mysql 列名称

c++ - C++ 优化级别是否影响 Swig Python 模块性能

java - 运行时优化

postgresql - 在大表上创建索引 - postgresql 9.6

jquery - 将base64编码的签名存储在数据库中