0

我的任务是支持一个非常缓慢的客户端的应用程序。我启用了 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

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

4

1 回答 1

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
于 2012-06-25T21:51:26.880 回答