Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中是;式中,a=2和b=';威利安'&引用;与“相同”;其中b=';威利安';和a=2;?_Mysql_Performance_Time - Fatal编程技术网

在mysql中是;式中,a=2和b=';威利安'&引用;与“相同”;其中b=';威利安';和a=2;?

在mysql中是;式中,a=2和b=';威利安'&引用;与“相同”;其中b=';威利安';和a=2;?,mysql,performance,time,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

在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

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


谢谢。

优化器可以而且经常会更改谓词的求值顺序,以便更好地利用索引。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;
CREATE TABLE filler(
id INT NOT NULL主键自动递增
)引擎=内存;
分隔符$$
创建过程prc_填充(cnt INT)
开始
声明_cntint;
设置_cnt=1;

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

+1,通过添加,您可以强制MySQL使用特定的索引,但只有在您真的、真的,真的确定这在您的生产环境中实际上更好(不要假设使用其他数据/服务器进行开发测试可以说明生产环境的任何情况)。@Wrikken:谢谢,我现在使用的是简单的表,所以它就足够了。没有索引和任何类型的Statistic是合乎逻辑的。但这并没有任何问题,我正在优化一个框架,该框架使用对象自动创建数据库,因此它也会创建索引。谢谢您的回复:)
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;