Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему замена WHERE field = x на WHERE field in (x,y) отключает поиск по индексу? / 3 сообщений из 3, страница 1 из 1
10.01.2017, 03:46
    #39381179
Ilya Evseev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему замена WHERE field = x на WHERE field in (x,y) отключает поиск по индексу?
Имеется MariaDB 10.1.20

Создаю таблицу:
Код: sql
1.
2.
3.
4.
5.
CREATE TABLE test2 (
   id INTEGER NOT NULL DEFAULT 0,
   flag enum('y','n') NOT NULL DEFAULT 'n',
   KEY(id), KEY(flag)
) ENGINE=InnoDB;



Так выборка по ключу работает:
Код: sql
1.
2.
3.
4.
5.
6.
> EXPLAIN SELECT * FROM test2 WHERE id = 1;
+------+-------------+-------+------+---------------+------+---------+-------+------+-------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra |
+------+-------------+-------+------+---------------+------+---------+-------+------+-------+
|    1 | SIMPLE      | test2 | ref  | id            | id   | 4       | const |    1 |       |
+------+-------------+-------+------+---------------+------+---------+-------+------+-------+



А так почему-то не работает:
Код: sql
1.
2.
3.
4.
5.
6.
> EXPLAIN SELECT * FROM test2 WHERE id IN (1,2);
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
| id   | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+
|    1 | SIMPLE      | test2 | ALL  | id            | NULL | NULL    | NULL |    1 | Using where |
+------+-------------+-------+------+---------------+------+---------+------+------+-------------+


Что ему мешает?
...
Рейтинг: 0 / 0
10.01.2017, 07:36
    #39381201
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему замена WHERE field = x на WHERE field in (x,y) отключает поиск по индексу?
Запросы неэквивалентны.

Код: sql
1.
EXPLAIN SELECT * FROM test2 WHERE id = 1 OR id=2;
...
Рейтинг: 0 / 0
10.01.2017, 09:32
    #39381241
Melkij
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему замена WHERE field = x на WHERE field in (x,y) отключает поиск по индексу?
Странно видеть что-то с названием id и не являющееся первичным ключом.
Вероятно, у вас в табличке мало данных - вот оптимизатор и решил, что ему проще пройтись последовательно seqscan'ом, чем читать индекс и потом по табличке ходить чистым random io читать значения остальных полей. Innodb же, кластеризован по первичному ключу (которого у вас нет - значит по неявно-сгенерированному ключу) и все вторичные индексы указывают на значение первичного ключа, а не самих данных.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему замена WHERE field = x на WHERE field in (x,y) отключает поиск по индексу? / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]