关于WHERE子句条件顺序的性能优势

时间:2013-05-06 11:56:21

标签: mysql sql sqlperformance

考虑3个表(主键为*,外国为+

User {*id:INTEGER, name:VARCHAR(45)}
Flight {*id:INTEGER, service:VARCHAR(45), departureDate:DATETIME}
Reservation { +userId, +flightId }

数据:

用户:

User

飞行:

Flight

预留:

Reservation

以下查询将获取2013-05-06上的乘客列表:

SELECT *
FROM user u, flight f, reservation r
WHERE u.id=f.id AND r.userid=u.id AND r.flightid=f.id AND f.departureDate='2013-05-06'

我的问题是:

  1. SQL引擎如何处理WHERE子句?参考上述查询,它首先通过r.userid = u.id组合r和f,然后通过r.flightid = f.id组合T1和f的另一个临时表T2,最后形成临时数据表T1,最后过滤到departureData在T2?

  2. 如果子句更改为:WHERE f.departureDate='2013-05-06' AND u.id=f.id AND r.userid=u.id AND r.flightid=f.id,那么性能会发生变化吗?在这种情况下,f.departureDate ='2013-05-06'会减少行以形成临时表吗?

2 个答案:

答案 0 :(得分:2)

1)不,订单并不重要。这都是关于数据库引擎的。数据库引擎可以做出明智的选择,比如先执行基本命令,然后再留下其他复杂命令所以不要考虑重新排序语句,查询优化器会为你做。只是给出一个查询优化器所做的基本示例是转换语句:

  

(B> = 5 AND B = 5)OR(B = 6和5 = 5)OR(B = 7和5 = 6)

  

B = 5或B = 6

2)同样,没有区别。

没有完整的MySql查询优化工具列表,但您可以找到其中一些here

答案 1 :(得分:1)

每个引擎都根据提供商,版本,构建等而有所不同。因此,唯一真正知道的方法是使用查询分析工具进行测试,找出最适合您情况的工具。

一般来说,最好总是减少系统必须生成的笛卡尔积,从而减少必须解析的数据。

直接回答你的问题:

1)它可以先生成用户,航班,预订数据,然后根据您的where子句限制结果。因此,如果用户航班和预订各有(100,1000,10000)行,它将生成100 * 1000 * 10000行,然后限制数据。或者它可能会首先限制数据(然后获取所有的数据然后再次连接它取决于引擎)发动机旨在针对性能进行优化,以便它尽力为您做到最好;因此需要使用查询分析器并找到您的引擎。

2)再次取决于您的RDMBS版本。它可能查询分析器是你的朋友学习使用它!

现在,如果你在离开日期没有一个indiex,那么有一个会给你最好的好处以及u.id,f.id和r.userid

相关问题