如何让我的MySQL查询与许多左连接执行得更快?
我写了一个查询,并在本地工作正常。当它是生活我得到这个错误:如何让我的MySQL查询与许多左连接执行得更快?
ERROR 1104: The SELECT would examine too many records and probably take a very long time. Check your WHERE and use SET OPTION SQL_BIG_SELECTS=1 if the SELECT is ok
我已经加入SET SQL_BIG_SELECTS=1;
。它现在正在工作,但运行速度非常缓慢。任何一个可以整理我的查询,ege而不是LEFT JOIN使用另一种方法。 这是我的查询:
SELECT sh.*,
ps.provider_name,
ps.photo_path AS photo
FROM scholarship sh
left join cat_category_sch ccs
ON ccs.scholar_id = sh.id
left join elg_countries_sch elg
ON elg.scholar_id = sh.id
left join study_level_sch sls
ON sls.scholar_id = sh.id
left join taken_country_sch tcs
ON tcs.scholar_id = sh.id
left join providers ps
ON ps.id = sh.provider
left join countires c1
ON c1.id = elg.county_id
left join countires c2
ON c1.id = tcs.county_id
left join study_level sl
ON sl.id = sls.study_level_id
WHERE sh.status = 1
AND sh.ain_status = 1
AND sh.deadline >= Date_sub(Now(), interval 1 year)
GROUP BY sh.id
ORDER BY sh.id DESC
在此先感谢
LEFT意味着“正确”表并没有一个“匹配”行。然而,你不用IS NULL或IS NOT NULL检查是否存在。那么,我怀疑LEFT是不必要的? (由于(1)它可能会分散实际问题并且(2)它可能减慢查询的速度)。
如果需要LEFT,那么ON tcs.scholar_id = sh.id
需要scholar_id
上的索引。 (等)
此外,复合索引INDEX(status, ain_status, deadline)
可能会有所帮助。
感谢您的更新,但我不知道 – 2015-03-03 06:58:04
1.添加我建议的索引。 2.向我们介绍为什么你使用了LEFT JOIN而不是JOIN。 – 2015-03-03 07:04:24
谢谢@rick。在具有索引的每个表中,即** id **(自动递增)。并且我不知道哪一个更好或者是LEFT JOIN或JOIN – 2015-03-03 09:46:49
对于初学者...最后三个左连接似乎没有用,你没有使用这些数据,所以你不需要使用它们。这可以改善查询的运行时间。 – 2015-03-02 12:45:39
向我们展示表结构(使用任何索引)并针对查询运行EXPLAIN以显示MySQL如何执行它 – 2015-03-02 12:45:55
最后3个连接也是必需的,因为在某些情况下,我已经使用了条件基于这些表的位置,所以我把它放在上面的查询我删除了一些条件。在每个表中,我维护索引(自动增量),如ID – 2015-03-02 12:55:59