Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
Подскажите, пожалуйста, если кто сталкивался, почему может выбираться неверный индекс? Есть таблица с полем t, по которому построен индекс. В таблице миллионы строк, при этом для большинства значений t запрос на выборку количества заданных значений использует корректный индекс (t) и работает быстро (секунды). А вот для одного значения (202) индекс не используется, даже будучи принудительно задан через USE INDEX и FORCE INDEX. Индекс не битый, проверял на разных серверах и версиях MySQL (5.5.25 и 5.5.54). EXPLAIN выдает только одно различие в типе запроса: ref или index, но мануал по оптимизатору ничего полезного мне по этой теме не дал. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 14:42 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
colibrii, Покажите DDL таблицы. Гипотеза с потолка - поле t строкового типа и там реальное значение, например, '202 '. Т.е. 202 с пробелом. Покажите вывод запроса: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2017, 18:56 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
miksoftcolibrii, Покажите DDL таблицы. Гипотеза с потолка - поле t строкового типа и там реальное значение, например, '202 '. Т.е. 202 с пробелом. Покажите вывод запроса: Код: sql 1. Поле t целочисленное, загрузка данных делается скриптом, который передает число, т.е. пробел попасть туда не мог бы никак, даже случайно. Как будто тут какой-то косяк с тем, что сервер воспринимает 202 как неприменимое к индексу значение. Вот это ref=NULL в EXPLAIN говорит, что тип аргумента для поиска непонятен. Хотя для 204 или 210 всё нормально. Пробовал CAST(202 AS UNSIGNED), не помогло. Мистика... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2017, 12:54 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
Вот провел еще эксперимент. Оптимизатор изучает статистику и принимает странное решение о неприменимости индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.06.2017, 13:07 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
colibrii, ...вы не стесняйтесь, как вас просили, покажите DDL. и в частности все что связано с индексами. Пока видно что есть какието индексы t_val , up_t и может быть еще какие. При этом попытка USE INDEX(t) выглядит страных... или у вас есть еще один индекс "t" ? Попробуийте USE INDEX(t_val) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2017, 03:48 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
colibrii, И сколько всего записей в таблице? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2017, 21:16 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
javajdbccolibrii, ...вы не стесняйтесь, как вас просили, покажите DDL. и в частности все что связано с индексами. Пока видно что есть какието индексы t_val , up_t и может быть еще какие. При этом попытка USE INDEX(t) выглядит страных... или у вас есть еще один индекс "t" ? Попробуийте USE INDEX(t_val) Пробовал и USE INDEX и FORCE INDEX для t и t_val, ничего не меняется (индекс отображается в поле key, но не используется). Удалил несвязанные поля и индексы для простоты, таблица такая: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2017, 01:00 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
miksoftcolibrii, И сколько всего записей в таблице? Статистика вот такая, как на картинке. Оптимизатор немного ошибается в оценках для значений 195 и 206, но не критично (не на порядок). И берет правильный индекс сам. А вот 202 какое-то заколдованное число, он думает, что их 18 млн, а не 1 млн. Даже если индекс указать принудительно, он использован не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2017, 01:04 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
colibrii, kel_len=387 -- чертовшина какаято, там же только два поля Т и НМ. Советую сделать так: 1. создать таблицу БЕЗ индексов кром примари. 2. салить данные. 3. создать индекс ТОЛЬКО по "Т" 4. протестировать 5. если ОК, удалит индекс по "Т" и сделат' индекс по Т,НМ 6. протестировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2017, 03:09 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
поправки: 1. создать таблицу БЕЗ индексов кромЕ примари. 2. Залить данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2017, 03:10 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
javajdbckel_len=387 -- чертовшина какаято, там же только два поля Т и НМ. Цифра правильная, 4 байта int + varchar (2 + 127*3 байта) как раз получается 387 байт каждая индексная запись. Но вот почему просмотр всего индекса целиком?.. Не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2017, 09:05 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
colibrii, Попробуйте: 1) OPTIMIZE TABLE (возможно, уже этого окажется достаточно). 2) Создайте индекс отдельно по полю t. С целью минимизации его размера имеет смысл заменить тип поля на SMALLINT или даже TINYINT (предварительно нужно убедиться, что фактические величины поля t гарантированно укладываются в рамки этих типов). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2017, 19:40 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
miksoftcolibrii, Попробуйте: 1) OPTIMIZE TABLE (возможно, уже этого окажется достаточно). 2) Создайте индекс отдельно по полю t. С целью минимизации его размера имеет смысл заменить тип поля на SMALLINT или даже TINYINT (предварительно нужно убедиться, что фактические величины поля t гарантированно укладываются в рамки этих типов). Дело в том, что у меня не стоит задачи победить именно этот случай, а нужно гарантировать отсутствие подобного в будущем. Для этого нужно понять, как рассуждает оптимизатор, когда игнорирует мой совет про индекс. Ну, я знаю, что если индекс подразумевает сканирование больше 5% таблицы, то он игнорируется, но тут, надеюсь, не этот случай. Хотя в %% получается как раз 5, да. Но я же велю ему именно использовать индекс. Да и для других условий получается до 10% надо сканировать (для 206, например, см. скриншот выше), и оптимизатору это пофиг. Если создать таблицу заново и построить отдельно индекс по полю t, то всё норм, но мне это не подходит (не могу такое выдать заказчику, ибо уволят сразу). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2017, 00:02 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
colibrii, ...вместо причитаний, больше пользы принесут результаты тестов которые я и МикСофт вас попросили сделать... ...можете ли вы воспроизвести сбой на 202 начиная с чистой таблицы и заливки данных? Возможно значения NM как-то влияют, хотя, по идее, не должны. ...USE INDEX -- только совет. FORCE INDEX -- вот это приказ, и то , где-то писали -- не 100% обязательный к выполнению. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2017, 05:34 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
Дело в том, что у меня не стоит задачи победить именно этот случай, а нужно гарантировать отсутствие подобного в будущем. Этого невозможно сделать в принципе, никогда. Стоимостные оптимизаторы в принципе так устроены, что они порядка 20% запросов не могут оптимизировать принципиально, базируясь на тех принципах, на которых они устроены. Это для хороших оптимизаторов даже верно, а в MySQL оптимизатор мягко говоря не шикарный. Для этого нужно понять, как рассуждает оптимизатор, когда игнорирует мой совет про индекс. Когда игнорирует HINT, это либо баг оптимизатора/СУБД, либо индекс для данного запроса не может использоваться в принципе. У тебя запрос со статистикой какой-то очень странный, результат которого ты дал. Там во-первых, для всех значений число записей одинаково, во-вторых, оно очень большое -- больше миллиона записей. При такой низкой селективности запросу использовать индекс в принципе не выгодно, и индекс не должен использоваться для этого значения. Тебе какой дали запрос ? Код: plaintext А ты чё написал ? Если создать таблицу заново и построить отдельно индекс по полю t, то всё норм, но мне это не подходит (не могу такое выдать заказчику, ибо уволят сразу). Ты должен на таблицы строить такие индексы, которые нужны базе данных, а не заказчику. Это не дело заказчика, думать какие индексы делать, его дело --деньги платить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2017, 11:40 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
javajdbccolibrii, ...вместо причитаний, больше пользы принесут результаты тестов которые я и МикСофт вас попросили сделать... ...можете ли вы воспроизвести сбой на 202 начиная с чистой таблицы и заливки данных? Возможно значения NM как-то влияют, хотя, по идее, не должны. ...USE INDEX -- только совет. FORCE INDEX -- вот это приказ, и то , где-то писали -- не 100% обязательный к выполнению. Так я сделал всё, что советовали. ANALYZE TABLE не помогает. Изменить тип данных мне не позволят, так же как и архитектуру. Я пробовал воспроизвести сбой на синтетических данных, включая NM. При том же объеме, но загруженные в другой последовательности, данные не дают такого косяка при выборе индекса. Рано или поздно я найду в чем проблема, именно проверяя кучу гипотез, но хотелось бы раньше, чем позже. Потому я и задал вопрос, что может кто знает логику оптимизатора для этого достаточно примитивного случая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2017, 14:45 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
colibriiANALYZE TABLE не помогает.ANALYZE TABLE и OPTIMIZE TABLE - разные вещи. Хотя и второе включает в себя первое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2017, 20:33 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
colibriiПри том же объеме, но загруженные в другой последовательности, данные не дают такого косяка при выборе индекса.В качестве танцев с бубном - можно попробовать ALTER TABLE ... ORDER BY t и затем ANALYZE TABLE. Возможно, это изменить статистику в нужную сторону. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.06.2017, 20:39 |
|
||
|
Оптимизатор не выбирает подходящий индекс
|
|||
|---|---|---|---|
|
#18+
miksoftcolibriiANALYZE TABLE не помогает.ANALYZE TABLE и OPTIMIZE TABLE - разные вещи. Хотя и второе включает в себя первое. Опечатался. Я пробовал и OPTIMIZE, и REPAIR, и ANALYZE... Нет эффекта, потому что ошибок там нет. Как ни странно, заработал FORCE INDEX. Я его пробовал на одном сервере только до этого, не работало. Теперь работает на всех. Остановлюсь на нем. EXPLAIN теперь говорит, что оптимизатор прикидывает, что записей с кодом 202 - 10 млн штук (реально их 1 млн). Неудивительно, что индекс не хочет браться. В общем, проблема решена, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.06.2017, 03:37 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=73&tid=1830630]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
| others: | 265ms |
| total: | 397ms |

| 0 / 0 |
