|
|
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
Добрый день, Не подскажите по какой причине mysql (точнее MariaDB) может использовать вместо покрывающего индекса -его частичный аналог? Есть запрос: SELECT * FROM TABLE t0 WHERE t0.CREATED >= '2016-01-22 00:00:00' AND t0.INTERFACE_ID = 5 ORDER BY t0.ID DESC LIMIT 20, 20; Есть два составных индекса: CREATED_INTERFACE по полям CREATED и INTERFACE_ID ID_additional_fields по полям INTERFACE_ID, field3,field4 и field5. Так же есть кластерный индекс - t0.ID. Так же известно, что innodb неявно добавляет кластерный индекс в конец любого другого индекса. Соответственно при использовании индекса CREATED_INTERFACE выборка находится и сортируется полностью с помощью индекса. Возникла проблема, что иногда БД предпочитает использовать ID_additional_fields индекс. В итоге по индексам может вытянуться до миллиона строк. Сортировка сразу уходит из памяти на диск. Срок выполнения увеличивается с секунды до 30-ти минут. Force_index ситуацию спасает, но по техническим причинам использовать его нельзя. Очень нужны советы по разрешению подобных ситуаций :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 15:49 |
|
||
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
Server version: 10.0.17 Maria Db Explain первого случая: 'id' 'select_type' 'table' 'type' 'possible_keys' 'key' 'key_len' 'ref' 'rows' 'Extra' '1' 'SIMPLE' 't0' 'range' 'CREATED_INTERFACE' 'CREATED_INTERFACE' '12' - '7283442' 'Using index condition; Using filesort' Explain второго случая: 'id' 'select_type' 'table' 'type' 'possible_keys' 'key' 'key_len' 'ref' 'rows' 'Extra' '1' 'SIMPLE' 't0' 'ref' 'CREATED_INTERFACE,CODE_STATS,ID_additional_fields' 'ID_additional_fields' '4' 'const' '24618' 'Using where; Using filesort' Могу предположить, что ему кажется, что полученые 24618 строк быстрее отсортировать на диске, чем пройтись по 7283442 индексным записям. Но это лож! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 15:59 |
|
||
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
Григорий С, судя по Using filesort, индекс в сортировке не используется. Попробуйте явно добавить это поле в индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 16:28 |
|
||
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
Наверное вы правы. Но даже если не используется - это не критично. Критично, когда он полностью отказывается от первого индекса в пользу второго. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 16:40 |
|
||
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
см Index Hints ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 16:55 |
|
||
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
Если нельзя использовать Force_index и прочие подсказки, то только изменять индексы так, чтобы БД не хваталась за ненужные индексы. Вплоть до удаления мешающихся индексов. Но по идее должно всё заработать как надо после избавления от Using filesort , т.к. LIMIT 20, 20 ограничит поиск строк до минимума. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 16:58 |
|
||
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
Ну ещё попробуйте сделать OPTIMIZE TABLE для этой таблицы, но если это поможет, значит придётся делать его затем периодически. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 17:06 |
|
||
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
авторконец любого другого индекса а innoBD об этом знает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 17:51 |
|
||
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
ScareCrowавторконец любого другого индекса а innoBD об этом знает?Знает. И, более того, начиная с версии 5.6.9 умеет этим пользоваться для оптимизации запросов. http://dev.mysql.com/doc/refman/5.6/en/index-extensions.html InnoDB automatically extends each secondary index by appending the primary key columns to it. ... Before MySQL 5.6.9, the optimizer does not take into account the primary key columns of the extended secondary index when determining how and whether to use that index. As of 5.6.9, the optimizer takes the primary key columns into account, which can result in more efficient query execution plans and better performance. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.04.2016, 18:18 |
|
||
|
Использование индексов в InnoDB
|
|||
|---|---|---|---|
|
#18+
Григорий CДобрый день, Не подскажите по какой причине mysql (точнее MariaDB) может использовать вместо покрывающего индекса -его частичный аналог? Есть запрос: SELECT * FROM TABLE t0 WHERE какой тут покрывающий индекс, когда у тебя select * ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.04.2016, 00:23 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=106&tid=1831958]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
70ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 410ms |

| 0 / 0 |
