Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использование индексов в InnoDB / 10 сообщений из 10, страница 1 из 1
05.04.2016, 15:49
    #39208495
Григорий C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов в InnoDB
Добрый день,

Не подскажите по какой причине 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 ситуацию спасает, но по техническим причинам использовать его нельзя.

Очень нужны советы по разрешению подобных ситуаций :(
...
Рейтинг: 0 / 0
05.04.2016, 15:59
    #39208507
Григорий С
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов в InnoDB
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 индексным записям. Но это лож! :)
...
Рейтинг: 0 / 0
05.04.2016, 16:28
    #39208547
Использование индексов в InnoDB
Григорий С, судя по Using filesort, индекс в сортировке не используется. Попробуйте явно добавить это поле в индекс.
...
Рейтинг: 0 / 0
05.04.2016, 16:40
    #39208563
Григорий C
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов в InnoDB
Наверное вы правы. Но даже если не используется - это не критично. Критично, когда он полностью отказывается от первого индекса в пользу второго.
...
Рейтинг: 0 / 0
05.04.2016, 16:55
    #39208586
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов в InnoDB
...
Рейтинг: 0 / 0
05.04.2016, 16:58
    #39208592
Использование индексов в InnoDB
Если нельзя использовать Force_index и прочие подсказки, то только изменять индексы так, чтобы БД не хваталась за ненужные индексы. Вплоть до удаления мешающихся индексов.

Но по идее должно всё заработать как надо после избавления от Using filesort , т.к. LIMIT 20, 20 ограничит поиск строк до минимума.
...
Рейтинг: 0 / 0
05.04.2016, 17:06
    #39208601
Использование индексов в InnoDB
Ну ещё попробуйте сделать OPTIMIZE TABLE для этой таблицы, но если это поможет, значит придётся делать его затем периодически.
...
Рейтинг: 0 / 0
05.04.2016, 17:51
    #39208660
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов в InnoDB
авторконец любого другого индекса
а innoBD об этом знает?
...
Рейтинг: 0 / 0
05.04.2016, 18:18
    #39208678
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов в InnoDB
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.
...
Рейтинг: 0 / 0
06.04.2016, 00:23
    #39208843
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование индексов в InnoDB
Григорий CДобрый день,

Не подскажите по какой причине mysql (точнее MariaDB) может использовать вместо покрывающего индекса -его частичный аналог?

Есть запрос:
SELECT * FROM TABLE t0 WHERE


какой тут покрывающий индекс, когда у тебя select * ?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Использование индексов в InnoDB / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]