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
期望的行为(就性能而言)是:
-
过滤掉来自
buildings
和surface > 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 条件性能建议