我目前有这个查询:
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
期望的行为(就性能而言)将是:
>过滤掉表面>的建筑物的所有结果; 1000
>检索与剩余建筑物条目对应的位置数据.
我的查询目前正在这样做吗?从语法上来说,我希望WHERE需要在JOIN之前,但这是否可能? MySQL本身是否会进行任何优化,如果是这样,那么所有SQL语言的优化是否相同?
解决方法:
首先,您的查询与您想要的相反 – 它过滤掉(即移除)表面<= 1000的建筑物.
Syntactically I would expect that the WHERE would need to be before
the JOIN, but is this even possible?
不,你的语法很好.连接首先出现的原因是它们识别要查询的表和关系;只有在完成后才能指定您执行和不需要的行.
SQL语法的形式允许查询优化器理解你的意思(只要你
Does MySQL itself does any optimisation, if so, does that same
optimisation hold for all SQL languages?
是的,MySQL(以及几乎所有的SQL数据库引擎)都包含一个查询优化器,它将您的SQL转换为特定的指令.从理论上讲,SQL是一种declarative语言 – 你告诉计算机你想要实现什么,它应该能够找到最有效的方法 – 这与命令式编程(PHP,C,Ruby等)形成鲜明对比.你明确告诉计算机该做什么,以及以何种顺序.
您可以通过EXPLAIN获得最佳效果.
从性能的角度来看,连接的顺序和where子句不应该有所不同(尽管我已经看到了一些并不总是如此的数据库);但是,表格的索引策略会产生巨大影响.坏消息是,这确实在数据库引擎之间有所不同.
标签:performance,sql,mysql
来源: https://codeday.me/bug/20190825/1719571.html