"WHERE ... IN ...", "WHERE ...! = ..." проблема индексации запроса - PullRequest
3 голосов
/ 17 ноября 2011

Я использую MySQl базу данных.

Я знаю, что если я создам индекс для столбца, он будет быстро запрашивать данные из таблицы, используя этот индекс столбца. Но у меня все еще есть следующие вопросы:

(предположим, у меня есть таблица с именем cars , есть столбец с именем country , и я создал индекс для country column)

  1. Я знаю, например, что запрос SELECT * FROM cars WHERE country='japan' будет использовать индекс для столбца страна для быстрого запроса данных. Как насчет != операции? SELECT * FROM cars WHERE country!='japan'; также будет использовать индекс для запроса данных?

  2. Использует ли операция WHERE ... IN ... индекс для запроса данных? Например SELECT * FROM cars WHERE country IN ('japan','usa','sweden');

Ответы [ 4 ]

3 голосов
/ 17 ноября 2011

Общий ответ: это зависит.Это зависит от того, что оптимизатор базы данных считает лучшим способом получения данных, и его решение может потребоваться для распределения данных.

Например, если 99% ваших строк имеют страну = 'japan', возможно, первый запрос (=) не будет использовать индекс, но страна с != будет использовать его.

2 голосов
/ 17 ноября 2011

Вы можете использовать EXPLAIN SELECT, чтобы выяснить, использует ли ваш запрос индекс или нет.

Например:

EXPLAIN SELECT * 
FROM A 
WHERE foo NOT IN (1,4,5,6);

Может дать:

+----+-------------+-------+------+---------------
| id | select_type | table | type | possible_keys 
+----+-------------+-------+------+---------------
|  1 | SIMPLE      | A     | ALL  | NULL          
+----+-------------+-------+------+---------------

+------+---------+------+------+-------------+
| key  | key_len | ref  | rows | Extra       |
+------+---------+------+------+-------------+
| NULL | NULL    | NULL |    2 | Using where |
+------+---------+------+------+-------------+

В этом случае в запросе не было possible_keys, и поэтому для выполнения запроса не было key.Это столбец key, который вас заинтересует.

Дополнительная информация здесь:

0 голосов
/ 17 ноября 2011

Используйте 'EXPLAIN' , чтобы увидеть, что происходит с вашим запросом. Вероятно, вас заинтересуют столбцы «возможные_ключи» и «ключ».

EXPLAIN SELECT * FROM CARS WHERE `country` != 'japan'
0 голосов
/ 17 ноября 2011

Оба запроса будут использовать индексы (при условии, что в первом столбце есть индекс с country)

В случае сомнений используйте ОБЪЯСНИТЬ . Вы также захотите прочитать (хотя бы части) это

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