在mysql中,“WHERE a = 2 AND b ='Wiliam'”与“WHERE b ='Wiliam'和a = 2”相同?

时间:2010-07-28 23:24:22

标签: mysql performance time

在mysql中,WHERE子句的顺序是否会影响服务器处理查询所需的时间?

我知道查询是经过编译和优化的,但我不知道该优化是否会改变WHERE子句的顺序,因此在假设的情况下,处理首先选择结果的查询将花费更少的时间。例如,如果它以字符串索引开头,则为整数。

WHERE a = 2 AND b = 'Wiliam'

- 1: Search in 200 items and find 20 results with value a = 2
- 2: Search in 20 items and find 1 result with b = Wiliam

WHERE b = 'Wiliam' AND a = 2

- 1: Search in 200 items and find 20 results with value b = Wiliam
- 2: Search in 20 items and find 1 result with a = 2

如果我们开始搜索整数索引列,它会更快吗? mysql知道哪个子句的索引更差,可以进行第二次搜索吗?

感谢。

2 个答案:

答案 0 :(得分:4)

优化器可以并且经常会更改谓词评估的顺序,以便更好地利用索引。 MySQL保留每个索引的统计信息,并使用它们来选择哪个索引可能最快。关于选择哪个索引没有简单的规则:可以根据数据库中的数据和您要查找的值自由选择不同的索引。

如果没有索引可以有所作为,但很少值得担心:

SELECT * FROM table1
WHERE a = 2 AND b = 'Wiliam';

2.9 seconds

SELECT * FROM table1
WHERE b = 'Wiliam' AND a = 2;

2.6 seconds

测试数据:

CREATE TABLE filler (
        id INT NOT NULL PRIMARY KEY AUTO_INCREMENT
) ENGINE=Memory;

DELIMITER $$

CREATE PROCEDURE prc_filler(cnt INT)
BEGIN
        DECLARE _cnt INT;
        SET _cnt = 1;
        WHILE _cnt <= cnt DO
                INSERT
                INTO    filler
                SELECT  _cnt;
                SET _cnt = _cnt + 1;
        END WHILE;
END
$$

DELIMITER ;

CALL prc_filler(1000000);

INSERT INTO table1 (a, b)
SELECT id, 'Wiliam' FROM filler;

答案 1 :(得分:2)

不,条款的顺序无关紧要。在任何一种情况下,无论顺序如何,服务器都将确定要使用的最佳索引。每个索引都有统计数据,MySQL将用它来确定哪一个更具“选择性”(即哪一个需要最少数量的I / O来处理)并选择它。