优化查询(LEFT JOIN)
Posted
技术标签:
【中文标题】优化查询(LEFT JOIN)【英文标题】:optimizing query (LEFT JOIN) 【发布时间】:2013-11-16 12:34:49 【问题描述】:我的目标是同时显示公司的搜索结果:有类别和没有类别(尚未添加)。我的公司表大约有 12 000 条记录。有类别的公司大约只有 200 家。
有两个搜索输入: $name -> 公司或类别的名称。 $id_country -> 国家ID
我想显示: 1)所有数据库中有多少结果。 (这就是我使用的原因:SQL_CALC_FOUND_ROWS) 2) 我使用 LIMIT 每页显示 10 个结果(分页)。
我的查询:
SELECT SQL_CALC_FOUND_ROWS
c.*,
lc.name as langName,
lc.shortDesc,
lc.longDesc
FROM companies c
JOIN lang_companies lc USING(id_company)
LEFT JOIN categories_companies cc USING(id_company)
LEFT JOIN lang_categories lang_cat USING (id_category)
WHERE
lc.id_lang = '2' AND c.status = 1 AND c.active = 1 AND c.id_country = ".$id_country." AND
(lc.name = LCASE('".$name."') OR (lang_cat.name = LCASE('".$name."') AND lang_cat.id_lang = '2')
OR c.city = '".$name."')
GROUP BY c.id_company
ORDER BY c.id_hierarchi asc
LIMIT 0, 10
这个查询执行大约 6 秒,我想优化它。你可以帮帮我吗? 如有任何建议,我将不胜感激。
【问题讨论】:
您通常使用 AND 和 OR,但使用 && 是否有原因?实际上,我不知道 && 到底是什么/如果在这段代码中与 AND :) 有区别: lang_cat.name = LCASE('".$name."') && lang_cat.id_lang = '2'跨度> 是的,我的错误,我刚刚更正了它 你解决了这个问题了吗?如果没有,您可以将查询的当前执行计划添加到此问题中。这样就更容易分析执行情况并发现优化机会。 【参考方案1】:在查询的 FROM 部分中,您似乎并没有实际使用通过这两行连接的表:
LEFT JOIN categories_companies cc USING(id_company)
LEFT JOIN categories cat USING (id_category)
我认为您可以简单地将它们从查询中排除,如果它们通过诸如连接抑制行之类的更微妙的方式不相关。
【讨论】:
好的,我删除了“LEFT JOIN categories cat USING (id_category)”行,但是“LEFT JOIN categories_companies cc USING(id_company)”我需要知道哪个类别与公司相关。 对不起,我忽略了这一点。查询现在运行得更快了吗? 好的,时间完全相同 6 秒。我想到了嵌套的 SELECT - 但我不知道如何使用它以上是关于优化查询(LEFT JOIN)的主要内容,如果未能解决你的问题,请参考以下文章
查询优化 Not in to Left outer join
SQL优化:慎用标量子查询,改用left join提升查询效率