SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.03.2014 16:41:45

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Составление индексов для запроса с множеством or

Есть таблица из 5-и столбцов: id, id2, type, misc и list.
Вот таким запросом выбираю значения list:

SELECT `misc`,`type`,`list` FROM ms_cllist WHERE `id2` = '64' and (
(`type` = 20 and (`misc` = 16129 or `misc` = 16128 or `misc` = 16122)) or
(`type` = 0 and (`misc` = 16130 or `misc` = 16129 or `misc` = 16123)) or
(`type` = 4 and (`misc` = 16130 or `misc` = 16129 or `misc` = 16123)) or
(`type` = 8 and (`misc` = 16130 or `misc` = 16129 or `misc` = 16123)) or
(`type` = 12 and (`misc` = 16130 or `misc` = 16129 or `misc` = 16123)) or
(`type` = 16 and (`misc` = 16130 or `misc` = 16129 or `misc` = 16123)) or
(`type` = 20 and (`misc` = 16130 or `misc` = 16129 or `misc` = 16123)));


Индексы:

PRIMARY KEY (`id2`,`misc`,`type`),
UNIQUE KEY `id2` (`id2`,`misc`,`type`) USING BTREE,
UNIQUE KEY `id` (`id`,`misc`,`type`) USING BTREE

Вывод EXPLAIN:

+----+-------------+------------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table            | type | possible_keys | key  | key_len | ref   | rows | Extra       |
+----+-------------+------------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | ms_cllist     n | ALL  | id2                | NULL | NULL    | NULL |    1 | Using where |
+----+-------------+------------------+------+---------------+------+---------+------+------+-------------+
1 row in set

Получается составной индекс задействовать не получается... Подскажите как для этого и подобных запросов правильно составлять индексы?

Отредактированно gif-t (10.03.2014 16:42:18)

Неактивен

 

#2 10.03.2014 18:19:32

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Составление индексов для запроса с множеством or

К сожалению запросы с OR используют индекс только в исключительных случаях. Используйте IN:

WHERE (`type`,`misc`) IN ((20,16129), (20, 16128), (20, 16122), (0, 16130), (0, 16129), ..)

Неактивен

 

#3 10.03.2014 20:17:03

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Составление индексов для запроса с множеством or

Спасибо, через IN индексы заработали

Неактивен

 

#4 22.03.2014 19:50:17

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Составление индексов для запроса с множеством or

Я ошибся, когда в WHERE передается несколько полей (`type`,`misc`), индексы не работают sad. Выборка же через AND

WHERE `type` IN (20,21,22) AND `misc` IN (334,4553,23343)
использует индексы, но выбирает также ненужные строки, т.к. выпадают все возможне комбинации... Есть ли еще какие-нибудь варианты выбрать только нужные данные с использованием индексов?

Неактивен

 

#5 22.03.2014 22:55:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Составление индексов для запроса с множеством or

А есть индекс (`misc`,`type`)?

Неактивен

 

#6 24.03.2014 20:18:19

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: Составление индексов для запроса с множеством or

Да, попробовал все комбинации индексов, IN не работает, видимо Percona 5.6.14-62.0 не поддерживает. Но заработало с комбинацией (... AND ... AND ...) OR (... AND ... AND ...) OR .., т.е. достаточно было избавиться от множественных OR

Неактивен

 

#7 10.04.2014 09:59:48

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Составление индексов для запроса с множеством or

Такой IN будет работать с индексом в MySQL 5.7. См. доклад Дмитрия Ленева на Moscow Mysql user group:

https://groups.google.com/d/msg/moscow- … MjvK9BHVwJ

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson