В mysql "WHERE a = 2 AND b = 'Wiliam'" совпадает с "WHERE b = 'Wiliam' AND a = 2"? - PullRequest
2 голосов
/ 29 июля 2010

В 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

That

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 ]

4 голосов
/ 29 июля 2010

Оптимизатор может и часто меняет порядок оценки предикатов, чтобы лучше использовать индексы.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;
2 голосов
/ 29 июля 2010

Нет, порядок пунктов не имеет значения.В любом случае сервер определит лучший индекс для использования независимо от порядка.Каждый индекс имеет статистику, которую MySQL будет использовать, чтобы определить, какой из них является более «селективным» (то есть, какой из них потребует наименьшее количество операций ввода-вывода для обработки) и выбрать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...