Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

У вас может быть несколько индексов и наличие 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-запросы, которые ищут условия, которые могут извлечь выгоду из добавления индексов.

Ответ 2

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

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

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

И вы спрашиваете:

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

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