MySQL: Сделать составной индекс из 3 полей или сделать 3 отдельных индекса?

StackOverflow https://stackoverflow.com/questions/4194943

  •  11-10-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Вы можете иметь несколько индексов и иметь idx1(tstamp, user_id) не исключает вас из indx2(tstamp, type) или же idx1reverse(user_id, tstamp) и так далее...

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

SELECT * FROM my_table WHERE tstamp = @ts1 AND user_id = @uid AND type = @type

Если вы хотите повысить производительность таких запросов, вы можете рассмотреть возможность добавления композитного индекса.

Недостатком индексов является то, что он замедляет все операции обновления. Тем не менее, большинство общих приложений делают гораздо больше выборов, а затем обновления (оба с точки зрения транзакций, то есть количество заявлений, и особенно с точки зрения затронутых/извлеченных записей) и в то же время гораздо более терпимы к более медленным обновлениям (пользователи в основном судят о скорости Система не к тому времени, когда необходимо обновить запись, но к моменту, необходимому для получения записей; опять же YMMV, и есть приложения, которые не играют по таким правилам).

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

РЕДАКТИРОВАТЬТакже понимайте, что индексы могут быть добавлены и сброшены, не влияя на систему с точки зрения функциональности. Поэтому вы можете настроить свои индексы позже, во время фактического использования системы - и обычно вы собираете и профилируют медленные запросы SQL, ищущие условия, которые могут выиграть от добавления индексов.

Другие советы

Если вы собираетесь выполнить поиск в этих полях отдельно, вам, вероятно, понадобятся отдельные индексы, чтобы ваши запросы работали быстрее.

Если у вас есть такой индекс:

mysql> create index my_idx on my_table(tstamp, user_id, type);

И вы запросите:

mysql> select * from my_table where type = 'A';

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top