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

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

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
Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2
    #39564934
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nik_wwwнужны другие идеи.
Переписать OR во WHERE на UNION двух запросов.

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

переписывать на union нету смысла. т.к. сортировка временной таблицы будет все равно без индекса - по сути получаем то же самое
flag = 0 встречается крайне редко, в основном flag = 1, поэтому нету смысла его включать в индекс, только лишний вес даст индексам //у этой таблички и так 25гб индексов
...
Рейтинг: 0 / 0
Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2
    #39567693
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НУ перепишите в такой вид:
Код: 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
Опимизация запроса вида WHERE key_part1 = value1 OR key_part1 = value2 ORDER BY key_part2
    #39568138
nik_www
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
полагаю, что вы предлагаете, то же самое, просто другой синтаксис
explain все равно показывает using filesort
тут без смены архитектуры таблиц не обойтись

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


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