执行MySQL查询真的很慢

时间:2012-06-25 21:37:34

标签: mysql sql

我的任务是支持缓慢运行的客户端应用程序。我启用了MySQL slow_query_log,发现了一些似乎是罪魁祸首的查询。我对这个查询正在做什么感到有点困惑,但是关于如何重写这个问题的任何建议都会有所帮助。

SELECT
    table_a.id AS table_a_id_1,
    table_a2.id AS table_a_id_2
FROM
    table_a,
    table_b
LEFT JOIN
    table_a AS table_a2
ON
    table_a.value = table_a2.value
WHERE
    table_a.value_id = 112 AND
    table_a2.value_id = 113 AND
    table_a.status != table_a2.status AND
    table_a.id = table_b.id;

对我而言,查询似乎是从单个表中选择两次相同的数据,然后与所选数据进行一些比较,以及同时执行与table_b的连接。以下是MySQL引用此查询执行的日志。

Query_time: 160.854398
Lock_time: 0.000139
Rows_sent: 12
Rows_examined: 10339025

您提供的任何建议都会有所帮助!

1 个答案:

答案 0 :(得分:3)

查询计划可能正在创建交叉连接,如WHERE子句中所指定的那样:

SELECT table_a.id AS table_a_id_1,
       table_a2.id AS table_a_id_2
FROM table_a join
     table_b
     on table_a.id = table_b.id LEFT JOIN
     table_a AS table_a2
     ON table_a.value = table_a2.value
WHERE table_a.value_id = 112 AND
      table_a2.value_id = 113 AND
      table_a.status != table_a2.status

这也表明table_a.id和table_a.value以及table_b.id上的索引可能会有很大帮助。

现在,您可以大量简化此查询。例如,它似乎是在table_a中获得112,113对,其中状态是不同的。我没有看到table_b的使用位置,除非有一些过滤标准。您可以通过以下方式更有效地获取此列表:

SELECT table_a.id AS table_a_id_1,
       table_a2.id AS table_a_id_2
FROM (select ta.* from table_a ta where ta.value_id = 112) ta join
     (select ta.* from table_a ta where ta.value_id = 113) ta2
     ON ta.value = ta2.value and
        ta.status != ta2.status