Нужны некоторые пояснения по индексам - PullRequest
0 голосов
/ 30 января 2019

Мы сталкиваемся с некоторыми проблемами с производительностью в некоторых отчетах, которые работают с миллионами строк.Я попытался оптимизировать SQL-запросы, но это только сокращает время выполнения до половины.

Следующим шагом является анализ и изменение или добавление некоторых индексов, поэтому у меня есть несколько вопросов:

1-SQL-запросы содержат много объединений: нужно ли создавать индекс для каждого внешнего ключа?

2 - Представьте себе запрос SELECT * FROM A LEFT JOIN B on a.b_id = b.id where a.attribute2 = 'someValue', и у нас есть индекс в таблице A на основе b_id и attribute2:использует ли мой запрос этот индекс для части where (я знаю, были ли два условия в условии where, где будет использоваться индекс).

3 - Если индекс основан на столбцах C1, C2 и C3,и я решил добавить индекс, основанный на C2, мне нужно удалить C2 из первого индекса?

Спасибо за ваше время

1 Ответ

0 голосов
/ 30 января 2019

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

СОЕДИНЕНИЕ происходит по одной таблице за раз, и порядок определяется MySQL, анализирующей запрос и пытающейся найти самый быстрый порядок.Вы увидите это в результате EXPLAIN.

  1. Только один индекс может быть использован для JOIN, и он должен быть на соединяемой таблице.В вашем примере используемый индекс будет id (первичный ключ) в таблице B. Создание индекса на каждом FK даст MySQL больше возможностей для плана запроса, что может помочь в некоторых случаях.

  2. Разница между условиями WHERE и JOIN существует только в том случае, если для объединенной таблицы есть NULL (пропущенные строки) (для INNER JOIN разницы нет вообще).Для вашего примера индекс на b_id ничего не делает.Если вы измените его на INNER JOIN (например, добавив b.something = 42 в предложении where), его можно использовать, если MySQL определит, что он должен выполнить запрос в обратном порядке (сначала b, затем a).

  3. Нет. Это нормально на 100% иметь столбец с несколькими индексами.Если у вас есть индекс на (A,B,C) и вы добавляете еще один на (A) , то будет избыточным и бессмысленным (потому что это префикс другого индекса).Индекс на B отлично.

...