既存のシステムを更新していて、既に使用されているコードの一部に固執する必要があります。main_id ごとにテーブル n にレコードが存在しない場合もあれば、多数存在する場合もあります。main に約 40k レコード、n に約 330k レコードがあります。
過去 6 か月以内に n.date を持たないメインのレコードのみを選択する必要があります。
残念ながら、私が試したすべての方法は非常に遅くなりました。
main.main_id
main.field1
main.field2
main.field3
n.n_id
n.main_id
n.date
n.field1
n.field2
n.field3
クエリは次の形式です
SELECT distinct(main.main_id) FROM main LEFT JOIN...
ビュー、一時テーブル、インデックスの追加など、さまざまな場所にサブクエリを配置しようとしましたが、これまでのところ、妥当な速度に近いものはありませんでした。
残念ながら、私がこれまでに試したことのリストを持っていなかったので、それらを書き留めておらず、遅くなりました!
nから直接クエリを実行したのではないかと思います。はるかに高速になる可能性がありますが、それには大規模な書き直しが必要になります。クエリには他にも多くの要素がありますが、テーブルが結合されている場合は 2 秒未満で完了しますが、これはありません。
これは考えられる最も単純なもので、通常は WHERE 句と JOIN が多くなります。
EXPLAIN
SELECT distinct(`main`.`main_id`),`morefields`,`morefields2`
FROM main LEFT JOIN anothertable ON anothertable anothertable.a_n = main.a
LEFT JOIN anothertable2 ON anothertable2.g_n = main.CG
LEFT JOIN anothertable3 ON anothertable3.t_n = main.t
LEFT JOIN (SELECT max(DateTS) as note_date, main_id FROM n GROUP BY main_id) n_sub ON main.main_id=n_sub.main_id
WHERE main.deleted = '0'
AND n_sub.note_date < DATE_SUB(now(), INTERVAL 6 MONTH)
ORDER BY main.morefields ASC LIMIT 0, 30;
+----+-------------+-------------+--------+---------------+---------+---------+----------------------------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+--------+---------------+---------+---------+----------------------------+--------+----------------------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 40324 | Using where; Using temporary; Using filesort |
| 1 | PRIMARY | main | eq_ref | PRIMARY | PRIMARY | 4 | n_sub.cust_no | 1 | Using where |
| 1 | PRIMARY | anothertable | eq_ref | PRIMARY | PRIMARY | 4 | db.maij.area | 1 | |
| 1 | PRIMARY | anothertable2 | eq_ref | PRIMARY | PRIMARY | 4 | db.main.CG | 1 | |
| 1 | PRIMARY | anothertable3 | eq_ref | PRIMARY | PRIMARY | 4 | db.main.t | 1 | |
| 2 | DERIVED | n | index | NULL | main_id | 4 | NULL | 285961 | |
+----+-------------+-------------+--------+---------------+---------+---------+----------------------------+--------+----------------------------------------------+
6 rows in set (30.25 sec)