Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2 / 6 сообщений из 6, страница 1 из 1
05.12.2017, 21:00
    #39564724
nik_www
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2
Здравствуйте!

Есть запрос вида:

SELECT id
FROM t1
WHERE ((key_part1 = [value11] AND key_part2 = [value12]) OR (key_part1 = [value21] AND key_part2 = [value22])) AND flag = 1
ORDER BY key_part3 DESC
LIMIT N, M;

Если убрать OR, то индекс (key_part1, key_part2, key_part3) будет работать.
Но этот OR нужен, надо как оптимизировать исходный запрос. Просто индексами, мне кажется, тут отделаться не получится, поэтому нужны другие идеи.

Табличка t1 состоит из более чем 500кк записей. Возможных сочетаний key_part1+key_part2 десятки миллионов. Есть случаи, когда запрос без LIMIT возвращает сотни тысяч записей, и мускулю приходится их все сортировать.

Заранее спасибо за ответы!
...
Рейтинг: 0 / 0
06.12.2017, 11:50
    #39564934
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2
nik_wwwнужны другие идеи.
Переписать OR во WHERE на UNION двух запросов.

nik_wwwЕсли убрать OR, то индекс (key_part1, key_part2, key_part3) будет работать.
(key_part1, key_part2, flag) будет ещё лучше "работать"...
...
Рейтинг: 0 / 0
11.12.2017, 14:50
    #39567690
nik_www
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2
Akina,

переписывать на union нету смысла. т.к. сортировка временной таблицы будет все равно без индекса - по сути получаем то же самое
flag = 0 встречается крайне редко, в основном flag = 1, поэтому нету смысла его включать в индекс, только лишний вес даст индексам //у этой таблички и так 25гб индексов
...
Рейтинг: 0 / 0
11.12.2017, 14:55
    #39567693
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2
НУ перепишите в такой вид:
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT id
FROM t1
WHERE (key_part1, key_part2) IN ( ([value11], [value12]), 
                                  ([value21], [value22]) )
  AND flag = 1
ORDER BY key_part3 DESC
LIMIT N, M;
...
Рейтинг: 0 / 0
12.12.2017, 10:31
    #39568138
nik_www
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2
полагаю, что вы предлагаете, то же самое, просто другой синтаксис
explain все равно показывает using filesort
тут без смены архитектуры таблиц не обойтись

я о таком синтаксисе не знал, очень удобный, за это спасибо
...
Рейтинг: 0 / 0
12.12.2017, 11:04
    #39568166
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2
nik_wwwexplain все равно показывает using filesort
При наличии индекса (key_part1, key_part2)? весьма странно... попробуй зафорсить. Или пересчитать статистику...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2 / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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