неселективный индекс mariadb для внешних ключей - PullRequest
0 голосов
/ 01 мая 2018

Я устраняю проблемы с очень медленным индексом на mariaDB. Это займет более 10 секунд. Таблица содержит более 10 миллионов строк. Предложение where имеет «где a = x и b = y». Столбец b имеет селективный индекс. Столбец a имеет неселективный индекс (только 5 различных значений), но его нельзя удалить, поскольку a является внешним ключом. mariaDB использует пересечение 2-х индексов, что делает его работу намного хуже, чем использование индекса по одному b. Я не знаю, как решить это, учитывая, что:

  • Я не могу удалить индекс, поскольку хочу обеспечить целостность
  • Я не хочу отменять оптимизацию индекса пересечения для всей базы данных
  • Я не хочу использовать индексные подсказки, поскольку это не стандарт (хотя я не уверен, какой другой вариант у меня есть).

Есть идеи?

1 Ответ

0 голосов
/ 02 мая 2018

ключ поиска автоматически добавляет индекс ...

Ну ... в MariaDB, да. Это не стандартная функция в любом случае; другие базы данных (Oracle, DB2, PostgreSQL и т. д.) не автоматически создают индексы для принудительного применения внешних ключей.

Мне не удалось полностью понять ваш вопрос, но мне кажется, у вас есть два индекса, один из которых использует столбец a, а другой - столбец b. И ... вы пытаетесь решить, какой из них использовать или как их объединить.

Нетрудно заставить упомянутый вами запрос использовать индекс. Если условие WHERE равно where a=x and b=y, то это идеальный случай, который нужно сильно ускорить, создав индекс (b, a), например:

create index ux_mytable_b_a on my_table (b, a);

Обратите внимание, что я использовал (b, a), а не (a, b). Таким образом, сначала выбирается наиболее селективный столбец, и у запроса меньше шансов на столкновение хешей и / или переполнение сегмента.

Теперь по поводу вашего наблюдения:

mariaDB использует пересечение двух индексов, что делает его работу намного хуже ...

Обратите внимание, что объединенный третий индекс (с двумя столбцами) позволяет избежать пересечения индекса . MariaDB автоматически выберет новый индекс, так как он быстрее, чем любая другая комбинация предыдущих.

...