|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
Пример. Есть такая БД: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42.
Таким запросом выбираю все жалобы на контрагентов в нужном доме (c.id_mkd=12) и пользователя, кто ее создал: Код: sql 1. 2. 3. 4.
idid(1)id(2)635624463764746386564642681464870346457174651723411725365372546557344 План Здесь вроде все ок, индексы работают. Но если усложнить этот запрос, добавив к нему еще выбор приказа, созданного по жалобе (если он есть, потому LEFT JOIN): Код: sql 1. 2. 3. 4. 5.
idid(1)id(2)id(3)6356244null6376474null6386564null6426814null6487034null6457174null6517234null117253206537254null6557344null то план становится таким: Почему поменялся порядок обработки таблиц? Почему теперь сканируется вся таблица claims x (не работает индекс)? Как этого избежать? PS ANALYZE делал, также как и изменял порядок джойнов - на плане никак не сказалось... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 10:54 |
|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
Чертовщина какая-то... Со вчерашнего вечера и по момент написания поста последний план не менялся, а сейчас внезапно стал таким, как ожидалось: Но ничего же в БД не менялось! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 11:26 |
|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
потому что Код: sql 1. 2.
подразумевает ВСЕ записи claims зачем индекс по Х использовать ------------------------- на сек не успел до посл сообщения.... Значит все же что то случилось ...) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 11:26 |
|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
LiYing, ну для чистоты экперимента можно пробовать SELECT SQL_NO_CACHE хотя как будто меняется приоритет операций JOIN ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 11:47 |
|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
Alex_Ustinov, SQL_NO_CACHE никак не повлияло. Тут другое вылезло :) Если на одну жалобу создано несколько приказов (ну бывает у нас такое)), то в выборку естественно попадают эти жалобы НЕ в единственном числе как надо. Правильно ли будет использовать DISTINCT Код: sql 1. 2. 3. 4. 5.
В плане появляется "Using temporary" чтобы удалить повторы? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 12:04 |
|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
LiYing Здесь вроде все ок, индексы работают. Проблема в том, что использование индексов в случае, если индексы взяты с потолка - как минимум бесполезно. А порой даже вредно. И тут как раз тот самый случай. И я, например, вовсе не уверен, что фуллскан хуже, чем попытка использования неподходящего индекса. Даже скорее наоборот. Например, для оптимизации запроса LiYing Код: sql 1. 2. 3. 4.
contragents (id_mkd, id) users (id) - имеется claims (id_contragent, id_user) - или поля в обратном порядке, в зависимости от статистики. LiYing Со вчерашнего вечера и по момент написания поста последний план не менялся, а сейчас внезапно стал таким, как ожидалось ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 12:47 |
|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
Akina, спасибо, поэкспериментирую с индексами. Боюсь наделать излишних индексов, поскольку таблицы используются в сотнях различных запросов с разными критериями выборки... Делать индексы на все возможные ситуации? Как тут поступить, посоветуете что? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 13:47 |
|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
Индексы - ускоряют SELECT и тормозят всё остальное (INSERT/UPDATE/DELETE). Так что всё зависит от использования БД. Если это БД, в которой данные изменяются редко и интерактивно (т.е. чхать на скорость IUD) - самое оно налепить всех индексов, которые нужны хотя бы для одного запроса. А если БД, наоборот, динамичная, с постоянной корректировкой данных - то вот тут индексов нужен самый минимум. Вернее, нужно искать баланс между тормозами корректировки из-за дохренищи индексов и тормозами выборки из-за отсутствия нужного индекса - да ещё с учётом приоритетов операций, в т.ч. приоритетов внешних. Непросто... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 14:39 |
|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
Akina это БД, в которой данные изменяются редко и интерактивно (т.е. чхать на скорость IUD) Думаю, у нас именно этот вариант. Раз в месяц в пару таблиц разово добавляется 20-30 тысяч записей - это статичные данные. Все остальное построено вокруг данных из этой пары таблиц - в день добавляется/редактируется редко до сотни записей в еще 5 таблицах. Значит, будем лепить индексы :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 15:04 |
|
Почему меняется план на ALL?
|
|||
---|---|---|---|
#18+
Да, учти, что чем больше индексов, тем больше надо времени планировщику для построения реально правильного плана. Так что если знаешь, какие индексы оптимальны для запроса - лучше хинтить. А если не знаешь - выяснять и хинтить. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.04.2020, 16:34 |
|
|
start [/forum/topic.php?fid=47&msg=39947409&tid=1828634]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
152ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 300ms |
total: | 535ms |
0 / 0 |