|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
Добррый всем день! Прошу мудрых советов Дано: version: mariadb-10.5.10-1 Есть 2 идентичные таблицы "test__addressobject" и "test2__addressobject" В запросах по идее должны индексы подключиться на поля AOID, но не подключаются, почему? Что случилось? Где я затупил? Ps: FORCE INDEX - Тоже не работает По этому запросу можно понять, какие изменения есть в первой таблице от второй Код: sql 1. 2. 3. 4. 5.
Вот здесь видно, что первая таблица не использует индекс: Код: html 1. 2. 3.
Вот структура: Код: plsql 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. 43. 44.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2021, 19:13 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
freebsdd, так а зачем для чтения всего d использовать индекс? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.09.2021, 20:17 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
freebsdd здесь видно, что первая таблица не использует индекс Если основная задача - оптимизировать запрос, то его следует переписать на WHERE NOT EXISTS. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 07:48 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
Melkij, Так ведь запрос сначала смотрит, чего нет в основной таблице по AOID, значит и должен использовать индекс, или я не верно представляю алгоритм действия работы mysql? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 12:00 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
Akina, Как я себе вижу это всё действо, это не совсем оптимизация, т.к. при WHERE NOT EXISTS mysql каждый раз во время просмотра каждой записи таблицы d выполняет запрос в таблицу f, чтоб узнать есть ли такая запись. Поправьте меня, если я ошибаюсь Чтоб имели представление, в таблице f на данный момент около 90 млн записей (и постоянно пополняется), а в таблице d в среднем около 7-9 млн записей (включая новые и изменённые) По Вашему совету сделал запрос: Код: sql 1. 2. 3. 4.
Код: html 1. 2. 3.
Вижу d не использует индексы, что вроде логично, т.к. тут идёт перебор всех записей от начала и до конца + каждое обращение к индексу таблицы f. Вот честно я не вижу оптимизации работы, или я ошибаюсь? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 12:16 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
freebsdd Melkij, Так ведь запрос сначала смотрит, чего нет в основной таблице по AOID, значит и должен использовать индекс, или я не верно представляю алгоритм действия работы mysql? Что такое "основная таблица"? d или f? В любом случае, опишите просто на словах такой алгоритм вычитания множеств, чтобы был смысл использовать какой бы то ни было индекс по левому множеству. Всё равно читать весь d целиком. Ну, merge join можно было бы попробовать применить. Если бы mariadb его ещё умела ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 13:13 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
Melkij, В Таблице f - Основные данные (это основная таблица), а в таблице d - изменённые и новые данные (туда заливаются обновления), таблицы полностью идентичные. Задача: быстро обновить данные из таблицы d в таблицу f, без индексов это происходит несколько часов. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 13:20 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
freebsdd Так ведь запрос сначала смотрит, чего нет в основной таблице по AOID И вообще - как правило, реальный порядок выполнения запроса имеет мало общего с его текстом. Иногда даже план выполнения, и то не очень-то адекватно отражает реальный порядок выполнения. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 18:56 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
Akina, Akina freebsdd Так ведь запрос сначала смотрит, чего нет в основной таблице по AOID И вообще - как правило, реальный порядок выполнения запроса имеет мало общего с его текстом. Иногда даже план выполнения, и то не очень-то адекватно отражает реальный порядок выполнения. Малость Вас не понял, поясните пожалуйста, вот запрос: Код: sql 1. 2. 3. 4.
1. Тут логично и очевидно следующее: сравниваем таблицы f и d по их первичным ключам AOID с помощью LEFT JOIN, благодаря чему мы получим отсутствующие аналогичные значения таблицы f в виде null, опираясь на это, мы получаем все значения таблицы d которых нет в таблице f (исключая все подобные с помощью AOID is null), в чём я заблуждаюсь? 2. И ещё момент - если у обоих таблиц AOID первичные ключи, то по логике вещей он должен их использовать при left join В 1 и 2 вопросе, что я упускаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 19:33 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
freebsdd если у обоих таблиц AOID первичные ключи, то по логике вещей он должен их использовать при left join Да никому он ничего не обязан. Тем более при SELECT * - вот нафига нужен индекс? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 20:28 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
Akina freebsdd если у обоих таблиц AOID первичные ключи, то по логике вещей он должен их использовать при left join Да никому он ничего не обязан. Тем более при SELECT * - вот нафига нужен индекс? Нет мочи пока понять ход Ваших мыслей, скажите причём тут SELECT *? Ведь индексы должны учитываться в теле, всё что после from, разве нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 21:37 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
freebsdd Ведь индексы должны учитываться в теле, всё что после from, разве нет? Индексы - всего лишь дополнительная структура, способная ускорить выполнение запроса. Но и способная замедлить, если его использовать не к месту. В данном случае - однозначно не к месту. Вот и не используется. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.09.2021, 23:01 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
Akina freebsdd Ведь индексы должны учитываться в теле, всё что после from, разве нет? Индексы - всего лишь дополнительная структура, способная ускорить выполнение запроса. Но и способная замедлить, если его использовать не к месту. В данном случае - однозначно не к месту. Вот и не используется. Ладно, что тогда сделать можно, чтоб ускорить выполнение запроса? Несколько часов это очень долго ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2021, 14:15 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
Попробуйте переписать на NOT EXISTS: Код: sql 1. 2. 3. 4. 5.
Правда, скорее всего ничего не изменится. Всё же связывание по VARCHAR - процесс заведомо небыстрый. Там же UUID? попробуйте конвертировать в BINARY(16) - всё побыстрее будет. Если такой тип запросов - и частый, и критичный по скорости, подумайте о переопределении данных и дополнительной связующей таблице, обновляемой триггерами. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2021, 15:17 |
|
Неочевидная проблема с индексами
|
|||
---|---|---|---|
#18+
Akina Попробуйте переписать на NOT EXISTS: Код: sql 1. 2. 3. 4. 5.
Правда, скорее всего ничего не изменится. Всё же связывание по VARCHAR - процесс заведомо небыстрый. Там же UUID? попробуйте конвертировать в BINARY(16) - всё побыстрее будет. Если такой тип запросов - и частый, и критичный по скорости, подумайте о переопределении данных и дополнительной связующей таблице, обновляемой триггерами. Да там UUID, хорошо, если других вариантов нет, попробую и так и так, понаблюдаю, спасибо Akina! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2021, 16:45 |
|
|
start [/forum/topic.php?fid=47&msg=40097352&tid=1827948]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
156ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 16ms |
total: | 275ms |
0 / 0 |