如何使我的mysql查询与许多左连接执行更快?

时间:2015-03-02 12:43:00

标签: php mysql

我写了一个查询,并在本地工作正常。当它出现时,我收到了这个错误:

  

错误1104:SELECT会检查太多记录而且可能   需要很长时间。检查您的WHERE并使用SET OPTION   如果SELECT正常,则SQL_BIG_SELECTS = 1

我添加了SET SQL_BIG_SELECTS=1;。它现在正在运行,但运行速度非常慢。任何人都可以整理我的查询,而不是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  

提前致谢

1 个答案:

答案 0 :(得分:0)

LEFT意味着'right'表可能没有'匹配'行。但是,您不会使用IS NULL或IS NOT NULL检查是否存在。所以,我怀疑LEFT是不必要的? (我提出了因为(1)它可能分散了真正的问题,(2)它可能会减慢查询速度。)

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

复合指数INDEX(status, ain_status, deadline)也可能有所帮助。