在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知道哪个子句的索引更差,可以进行第二次搜索吗?
感谢。
答案 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来处理)并选择它。