首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在mysql中,"WHERE a=2 AND b= 'Wiliam'“与"WHERE b= 'Wiliam‘AND a= 2”是否相同?

在mysql中,"WHERE a=2 AND b= 'Wiliam'“与"WHERE b= 'Wiliam‘AND a= 2”是否相同?
EN

Stack Overflow用户
提问于 2010-07-29 07:24:22
回答 2查看 93关注 0票数 2

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

我知道查询是经过编译和优化的,但我不知道这种优化是否会改变WHERE子句的顺序,因此在假设的情况下,处理首先选择整数结果的查询所需的时间比以字符串索引开头的查询要少。

代码语言:javascript
复制
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

代码语言:javascript
复制
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知道哪个子句有更差的索引来执行第二次搜索吗?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-29 07:26:52

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

在没有索引的情况下,它可以产生差异,但很少值得担心:

代码语言:javascript
复制
SELECT * FROM table1
WHERE a = 2 AND b = 'Wiliam';

2.9 seconds

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

2.6 seconds

测试数据:

代码语言:javascript
复制
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;
票数 4
EN

Stack Overflow用户

发布于 2010-07-29 07:27:41

不,子句的顺序并不重要。在任何一种情况下,服务器都将确定要使用的最佳索引,而不管其顺序如何。每个索引都有统计信息,MySQL将使用这些统计信息来确定哪个索引更具“选择性”(即,哪个索引需要处理的I/O数量最少)并进行选择。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3358348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档