MySQL连接的性能结合where子句

时间:2013-09-12 13:07:40

标签: mysql sql performance

我目前有这个问题:

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

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

  1. 使用buildings
  2. 过滤掉surface > 1000的所有结果
  3. 检索与剩余location条目对应的buildings数据。
  4. 我的查询目前正在这样做吗?从语法上来说,我希望WHERE需要在JOIN之前,但这是否可能? MySQL本身是否会进行任何优化,如果是这样,是否对所有SQL语言都进行相同的优化?

2 个答案:

答案 0 :(得分:6)

首先,您的查询与您想要的相反 - 它会过滤掉(即移除)表面为< = 1000的建筑物。

  

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

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

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

  

MySQL本身是否会进行任何优化,如果是这样,也会这样做   所有SQL语言的优化保持?

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

您可以通过EXPLAIN获得最佳效果。

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

答案 1 :(得分:0)

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