0

私は3つのテーブルを持っています:

表 1 :

id   |   name
1    |   joe
2    |   peter
3    |   sandra

表 2 :

id   |   fkId   |   date_updated
1    |    1     |   2013-01-31
2    |    1     |   2013-04-01
3    |    2     |   2013-02-04
4    |    2     |   2013-01-02

表3 :

id   |   fkId   |   date_updated
1    |    1     |   2013-01-31
2    |    3     |   2013-04-01
3    |    3     |   2013-02-04
4    |    2     |   2013-01-02

私は次のものを持っています:

SELECT * 
FROM 
     table1
LEFT OUTER JOIN 
     table2 ON table1.id = table2.fkId
LEFT OUTER JOIN 
     table3 ON table1.id = table3.fkId
GROUP BY 
     table1.id
HAVING 
     table2.date_updated = max(table2.date_updated)
     AND table3.date_updated = max(table3.date_updated)

私の出力は次のようになります。

 name |   table2   |  table3  
joe   | 2013-04-01 | 2013-01-31
peter | 2013-02-04 | 2013-01-02
sandra|            | 2013-04-01

必要なデータを取得しましたが、このクエリは時間がかかりすぎます。テーブル インデックスを変更せずに最適化する方法はありますか?

指摘事項:

  • table2 と table3 は同じテーブルではありません。

  • 日付だけでなく、table2 と table3 から "last_updated" だった行全体を取得する必要があります。

編集 **

WHERE table1.id = idを使用して単一のレコードを返す場合、クエリは約 3 ~ 4 秒かかります。

Table1 には ~ 84000 のレコードがあります

Table2 には ~ 96000 のレコードがあります

Table3 には ~ 81000 のレコードがあります

4

2 に答える 2

1

提示されたデータを使用すると、クエリは次のようになります。

SELECT table1.name, MAX(table2.date_updated), MAX(table3.date_updated)
FROM  table1 LEFT OUTER JOIN 
      table2
      ON table1.id = table2.fkId LEFT OUTER JOIN 
      table3 ON table1.id = table3.fkId
GROUP BY table1.id

table2(fkid, date_updated)および table3(fkid, date_updated)` のインデックスが役立つ場合があります。

実際、このようなインデックスを使用すると、このバージョンの方がパフォーマンスが向上する可能性があります。

select table1.name,
       (select date_updated from table2 where table1.id = table2.fkid order by date_updated desc limit 1
       ) as T2,
       (select date_updated from table3 where table1.id = table3.fkid order by date_updated desc limit 1
       ) as T3
from table1

これにより、グループ化が完全になくなり、相関サブクエリに置き換えられます。相関サブクエリは、インデックスの小さなインデックス スキャンになります。

于 2013-05-15T14:47:45.647 に答える
0

インデックスを変更せずに言及したことは知っていますが、「Table2」と「Table3」のそれぞれにインデックスを設定する場合にのみ、あなたがやろうとしていることはより最適化されます

( fkId、date_updated )。

各テーブルの「ID」列にインデックスしかない場合、結合では明らかに何も最適化されません。少なくとも Table1 への外部キーで必要になります。ただし、これはテーブルの新しいインデックスになるため、何も害することはなく、クエリを支援するだけです。このインデックスを Table2 と Table3 の両方で実行します。

于 2013-05-15T13:41:24.853 に答える