MySQL WHERE 子句中的条件顺序是否影响性能?
在具有大量 WHERE 子句和大量条件的 MySQL 查询中,这一点至关重要以优化性能。假设一种特定条件(例如公司标识符)将搜索空间从数十万大幅减少到数十万。此条件是否应该放在子句中的第一位?
考虑搜索与某些参数匹配的客户端的查询的两个版本:
SELECT * FROM clients WHERE (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) AND company = :ugh
SELECT * FROM clients WHERE company = :ugh AND (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar)
对性能的影响
传统上,人们认为条件的顺序对 MySQL 性能的影响很小甚至没有影响。然而,最近的测试和见解表明,在某些情况下,它确实可以发挥作用。
短路和条件顺序
关键因素是短-电路。在MySQL中,当评估由AND或OR连接的复合条件时,数据库引擎仅当条件相关时才评估第一个操作数。如果第一个条件大幅缩小搜索空间,则此优化可以节省大量时间。
演示
为了说明此效果,请考虑以下查询:
-- query #1 SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1; -- query #2 SELECT myint FROM mytable WHERE myslowfunction('query #2', myint) = 1 OR myint >= 3;
唯一的区别是 OR 条件中操作数的顺序。 myslowfunction 是一个刻意昂贵的函数,其中包括记录每次调用的副作用。
执行这些查询时:
myslowfunction called for query #1 with value 1 myslowfunction called for query #1 with value 2 myslowfunction called for query #2 with value 1 myslowfunction called for query #2 with value 2 myslowfunction called for query #2 with value 3 myslowfunction called for query #2 with value 4
如跟踪所示,myslowfunction 被调用的查询次数较少#1 因为第一个条件 (myint >= 3) 消除了许多不满足它的行。首先放置此条件可以提前终止并防止对慢速函数进行不必要的评估。
结论
因此,问题的答案是:是的,由于短路,WHERE 子句中的条件顺序有时会影响 MySQL 性能。通过首先放置限制性条件,数据库引擎可以通过避免不必要的处理并最大限度地提高效率来优化查询执行。
以上是MySQL WHERE 子句中条件的顺序会影响查询性能吗?的详细内容。更多信息请关注PHP中文网其他相关文章!