优化查询(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

优化查询(LEFT JOIN)

SQL优化:慎用标量子查询,改用left join提升查询效率

业务数据LEFT JOIN 多表查询慢--优化操作

HiveSql&SparkSql —— 使用left semi join做inexists类型子查询优化

Sql语句优化-查询两表不同行NOT INNOT EXISTS连接查询Left Join