我的任务是支持缓慢运行的客户端应用程序。我启用了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
您提供的任何建议都会有所帮助!
答案 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