如何让我的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 

在此先感谢

+0

对于初学者...最后三个左连接似乎没有用,你没有使用这些数据,所以你不需要使用它们。这可以改善查询的运行时间。 – 2015-03-02 12:45:39

+1

向我们展示表结构(使用任何索引)并针对查询运行EXPLAIN以显示MySQL如何执行它 – 2015-03-02 12:45:55

+0

最后3个连接也是必需的,因为在某些情况下,我已经使用了条件基于这些表的位置,所以我把它放在上面的查询我删除了一些条件。在每个表中,我维护索引(自动增量),如ID – 2015-03-02 12:55:59

LEFT意味着“正确”表并没有一个“匹配”行。然而,你不用IS NULL或IS NOT NULL检查是否存在。那么,我怀疑LEFT是不必要的? (由于(1)它可能会分散实际问题并且(2)它可能减慢查询的速度)。

如果需要LEFT,那么ON tcs.scholar_id = sh.id需要scholar_id上的索引。 (等)

此外,复合索引INDEX(status, ain_status, deadline)可能会有所帮助。

+0

感谢您的更新,但我不知道 – 2015-03-03 06:58:04

+0

1.添加我建议的索引。 2.向我们介绍为什么你使用了LEFT JOIN而不是JOIN。 – 2015-03-03 07:04:24

+0

谢谢@rick。在具有索引的每个表中,即** id **(自动递增)。并且我不知道哪一个更好或者是LEFT JOIN或JOIN – 2015-03-03 09:46:49