首先应考虑在 where 及 order by 涉及的列上建立索引,子查询条件内尽量不要使用全表扫描的条件,例如不要使用!=或<>,条件不要使用or来连接等等,如果确实需要OR连接,请修改为union来连接,其实最终目的还是避免全表扫描的条件
首先,你的查询其实可以写成: SELECT a.*,b.* FROM test1 a LEFT JOIN test2 b ON b.id=a.id其次,你使用了左外连接,而且没有 WHERE 条件,意味着 test1 中所有的数据都会返回,同时表很大,所以很慢。建议业务上加一些限制条件,如果一定要查询很多数据给前端显示,考虑使用分页显示;同时确认关联字段(id)上创建了索引;还有,实际项目不要用 * 返回所有字段,只输出你需要的信息。
SELECT a.*,b.*
FROM test1 a
LEFT JOIN test2 b ON b.id=a.id其次,你使用了左外连接,而且没有 WHERE 条件,意味着 test1 中所有的数据都会返回,同时表很大,所以很慢。建议业务上加一些限制条件,如果一定要查询很多数据给前端显示,考虑使用分页显示;同时确认关联字段(id)上创建了索引;还有,实际项目不要用 * 返回所有字段,只输出你需要的信息。
如果外连接必要的话,给出驱动表test1、test2表的数据总量,以及这个查询最后输出的数据量