Помогите понять и оптимизировать mysql запрос

lutskboy
На сайте с 22.11.2013
Offline
180
658

Здрасти

есть тбл и там индекс составной. 

INDEX gpt, approve
INDEX approve, allow_main

выполняю два запроса

SELECT `id`
FROM `dle_posty`
WHERE `approve` = '1' AND `allow_main` = '1'
ORDER BY `date` DESC
LIMIT 50;

SELECT `id`
FROM `dle_posty`
WHERE `gpt` = '1' AND `approve` = '1'
ORDER BY `date` DESC
LIMIT 50;

первый 13сек. второй 0.028

записей 30к. везде gpt=1 approve=1 allow_main тоже почти везде 1

как понять почему так

https://skr.sh/sPNfuS1OZsS

https://skr.sh/sPNrclKIY4H
 

L
На сайте с 10.02.2015
Offline
236
#1

Первый запрос решил использовать оптимизацию intersect. Она обычно или сильно решает или сильно тупит.

Только странно почему не хватило индекса approve_allow_main.

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

Возможно типы данных не совпадают где-то. Везде строки?

Кстати, может версия старая?

lutskboy
На сайте с 22.11.2013
Offline
180
#2
livetv #:
Кстати, может версия старая?

10.6.17-MariaDB

livetv #:
Возможно типы данных не совпадают где-то. Везде строки?

date тип datetime, а остальные тип tinyint

L
На сайте с 10.02.2015
Offline
236
#3
lutskboy #:

date тип datetime, а остальные тип tinyint

Попробуйте передать в запрос 1, а не '1'

Хотя обычно тупит, если передать наоборот число для поля строки.

lutskboy
На сайте с 22.11.2013
Offline
180
#4
livetv #:

Попробуйте передать в запрос 1, а не '1'

Хотя обычно тупит, если передать наоборот число для поля строки.

та нет. тоже так. плюс второй запрос тоже как строка. тут для меня непонятная картина

L
На сайте с 10.02.2015
Offline
236
#5
lutskboy #:

та нет. тоже так. плюс второй запрос тоже как строка. тут для меня непонятная картина

А Вы второй поправьте для проверки.

Как раз второй не захотел использовать индексы с фильтра, а стал использовать по дате.

Ну или втулите IGNORE INDEX / FORCE INDEX, но это затыкание дыр, а не решение проблемы.

LEOnidUKG
На сайте с 25.11.2006
Offline
1752
#6

В этот индекс добавьте: 

INDEXapprove, allow_main, date  DESC


Таблица в Innodb формате?

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/ ✅ Настройка и оптимизация серверов https://getmanyspeed.ru/
lutskboy
На сайте с 22.11.2013
Offline
180
#7
LEOnidUKG #:

В этот индекс добавьте: 

INDEXapprove, allow_main, date  DESC

а зачем? тут нет такого  INDEX gpt, approve

LEOnidUKG
На сайте с 25.11.2006
Offline
1752
#8
lutskboy #:

а зачем? тут нет такого  INDEX gpt, approve

Мы тут тестируем или в теории играем? Если в теории. Я бы 30К записей вообще в файлик записал и не трогал БД.

lutskboy
На сайте с 22.11.2013
Offline
180
#9
LEOnidUKG #:

Мы тут тестируем или в теории играем? Если в теории. Я бы 30К записей вообще в файлик записал и не трогал БД.

я же не всегда буду делать date  DESC. будет и ASC

W1
На сайте с 22.01.2021
Offline
306
#10
lutskboy :
первый 13сек

Что-то абсурдное. При таком количестве записей и при таком запросе эта цифра вообще из серии фантастики, даже если вообще никакие индексы не использовать и никак не оптимизировать запрос, который в данном случае простейший. Ничего не перепутал случаем?

Мой форум - https://webinfo.guru –Там я всегда на связи

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий