在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知道哪个子句有更差的索引来执行第二次搜索吗?
谢谢。
发布于 2010-07-29 07:26:52
优化器可以而且经常会更改谓词的求值顺序,以便更好地利用索引。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;发布于 2010-07-29 07:27:41
不,子句的顺序并不重要。在任何一种情况下,服务器都将确定要使用的最佳索引,而不管其顺序如何。每个索引都有统计信息,MySQL将使用这些统计信息来确定哪个索引更具“选择性”(即,哪个索引需要处理的I/O数量最少)并进行选择。
https://stackoverflow.com/questions/3358348
复制相似问题