我正在更新现有系统,需要坚持使用一些已使用的代码。每个 main_id 在表 n 中可能没有或有很多记录。main 中大约有 40k 条记录,n 中大约有 330k 条记录。
我只需要从 main 中选择过去 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 运行查询。表它可能会快很多,但这需要大量重写。查询中还有很多其他元素,但它在两秒钟内完成,表已加入,但没有这个。
这可能是最简单的——通常是更多的 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)