Запросы MySQL - определение составных и единичных индексов для нескольких запросов.Как предотвратить конфликты индексов и создание медленных запросов? - PullRequest
0 голосов
/ 24 мая 2019

Я изо всех сил пытаюсь выяснить, в какие столбцы лучше всего помещать мои индексы, когда кажется, что добавление дополнительных индексов может отрицательно повлиять на производительность запроса.

Например, у меня следующий запрос натаблица с 5-метровыми строками;

SELECT col1, col2 FROM table WHERE col1 = 'a' AND col2 = 'b' AND col3 = 'c';

Выполнение этого без индексов занимает 12 секунд!

Я добавляю составной индекс для всех 3 столбцов - table_col1_col2_col3_index;

Мой запрос теперь падает до 2 секунд - отлично!

Теперь у меня есть другой запрос к той же таблице (без индексов ни для одного столбца):

SELECT col1, col2 FROM table WHERE col1 = 'a';

Запуск этого самостоятельнои запрос занимает 4 секунды - все еще довольно медленно!

Так что теперь я добавляю индекс одного столбца к col1 table_col1_index

Мой запрос уменьшается до 0,2 секунды.Это здорово, однако теперь я снова запускаю исходный запрос и замечаю, что он использует этот индекс, а не тот, который я указывал ранее.Исходный запрос теперь выполняется в течение 6 секунд.

Я не уверен, как добиться того, чтобы оба запроса могли быть оптимизированы одновременно.

Ответы [ 2 ]

0 голосов
/ 26 мая 2019
  • Выключите кэш запросов или используйте SELECT SQL_NO_CACHE ... при выполнении синхронизации.

  • Запустите каждый тест синхронизации дважды.Первый может потратить дополнительное время на выборку данных и / или индексных блоков с диска.Второе время лучше для сравнения.(И ближе к тому, что было бы на «производственном» сервере.)

  • Сколько строк возвращается?Это может оказать влияние.Второй запрос может возвращать во много раз больше строк.

  • Пожалуйста, укажите SHOW CREATE TABLE - могут быть тонкие проблемы.(типы данных, размеры столбцов, параметры сортировки, кто-что знает)

  • Пожалуйста, укажите EXPLAIN SELECT ... - Как написано, каждый из ваших примеров должен сказать «Использование индекса», что означает, чтоindex «покрывает» запрос, что означает, что все столбцы в SELECT существуют в используемом INDEX.

  • Не использовать "indexподсказки "- хотя это может помочь запросу сегодня, это может повредить его завтра.

  • Все ваши примеры будут ('должны') извлечь выгоду из INDEX(col1, col2, col3), в этот заказ ;Я бы не стал добавлять другие.

0 голосов
/ 24 мая 2019

Вы можете создавать индексы, заботясь о том, чтобы оставить наиболее часто используемый или выборочный столбец слева, а затем упорядочивать индексы, если можете, чтобы вы могли использовать тот же индекс в большем количестве запросов.

Кроме того, вы всегда можетеРаспечатайте индекс, который вы считаете наиболее подходящим, используя FORCE (или IGNORE) https://dev.mysql.com/doc/refman/8.0/en/index-hints.html

SELECT * FROM table1 FORCE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...