MySQL结合where子句的join性能

Posted

技术标签:

【中文标题】MySQL结合where子句的join性能【英文标题】:MySQL performance of join combined with where clause 【发布时间】:2013-09-12 13:07:40 【问题描述】:

我目前收到此查询:

SELECT 
    location.street, 
    location.zip, 
    location.city, 
    surface, 
    price_buy, 
    price_rental 
FROM buildings 
JOIN location 
    ON building.location_id = location.location_id 
WHERE surface > 1000

期望的行为(就性能而言)是:

    过滤掉来自buildingssurface > 1000 的所有结果 检索与剩余buildings 条目对应的location 数据。

我的查询目前正在这样做吗?从语法上讲,我希望WHERE 需要在JOIN 之前,但这甚至可能吗? mysql 本身是否进行任何优化,如果有,是否对所有 SQL 语言都适用相同的优化?

【问题讨论】:

你能展示一些表格结构吗? 看起来您的查询是正确的。 表名是建筑物还是建筑物?一处旧楼,一处楼 【参考方案1】:

首先,您的查询与您想要的相反 - 它过滤掉(即移除)表面为

从句法上讲,我希望 WHERE 需要在之前 JOIN,但这有可能吗?

不,你的语法很好。连接首先出现的原因是因为它们识别要查询的表和那里的关系;只有在你完成之后,你才能指定你想要和不想要的行。

SQL 语法的形式允许查询优化器理解你的意思(只要你

MySQL 本身是否进行任何优化,如果有,是否相同 对所有 SQL 语言都进行优化吗?

是的,MySQL(以及几乎所有 SQL 数据库引擎)都包含一个查询优化器,可将您的 SQL 转换为特定指令。从概念上讲,SQL 是一种declarative 语言——你告诉计算机你想要实现什么,它应该找出最有效的方法来做到这一点——这与命令式编程( php、C、Ruby 等),您可以在其中明确告诉计算机要做什么以及按什么顺序。

您可以通过EXPLAIN 了解它的工作方式。

从性能的角度来看,连接的顺序和 where 子句不应该产生影响(尽管我见过一些数据库并不总是如此);但是,表的索引策略会产生巨大的影响。坏消息是,这在数据库引擎之间确实会有所不同。

【讨论】:

【参考方案2】:

如果您想要剩余的建筑物,请将 WHERE 子句设为相反:surface <= 1000。这将返回不合适的记录。

【讨论】:

以上是关于MySQL结合where子句的join性能的主要内容,如果未能解决你的问题,请参考以下文章

为啥向这个 MySQL 查询添加特定的 where 子句会成为性能瓶颈?

更详细地解释 JOIN 与 LEFT JOIN 和 WHERE 条件性能建议

如何结合where子句和join? [复制]

WHERE 子句中的字段顺序会影响 MySQL 的性能吗?

where子句中的mysql udf json_extract - 如何提高性能

where子句中的mysql udf json_extract - 如何提高性能