我目前有这个问题:
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
的所有结果
location
条目对应的buildings
数据。我的查询目前正在这样做吗?从语法上来说,我希望WHERE
需要在JOIN
之前,但这是否可能? MySQL本身是否会进行任何优化,如果是这样,是否对所有SQL语言都进行相同的优化?
答案 0 :(得分:6)
首先,您的查询与您想要的相反 - 它会过滤掉(即移除)表面为< = 1000的建筑物。
从语法上讲,我希望WHERE需要在之前 JOIN,但这有可能吗?
不,你的语法很好。连接首先出现的原因是它们识别要查询的表和关系;只有在完成后才能指定您执行和不需要的行。
SQL语法的形式允许查询优化器理解您的意思(只要您
)MySQL本身是否会进行任何优化,如果是这样,也会这样做 所有SQL语言的优化保持?
是的,MySQL(以及几乎所有的SQL数据库引擎)都包含一个查询优化器,它将您的SQL转换为特定的指令。从概念上讲,SQL是一种declarative语言 - 你告诉计算机你想要实现,并且它应该以最有效的方式来实现它 - 这与命令式对比编程(PHP,C,Ruby等),您可以明确告诉计算机该做什么,以及以何种顺序。
您可以通过EXPLAIN获得最佳效果。
从性能的角度来看,连接的顺序和where子句不应该有所不同(尽管我已经看到了一些并不总是如此的数据库);但是,表格的索引策略会产生巨大影响。坏消息是,这确实在数据库引擎之间有所不同。
答案 1 :(得分:0)
如果您想要剩余的建筑物,请将WHERE子句对面:surface <= 1000
。这将返回不合适的记录。