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;

私には、クエリが1つのテーブルから同じデータを2回選択し、選択したデータとの比較を行っているように見えます。また、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 に答える