Добавление индексов в таблицы Gerrund - PullRequest
5 голосов
/ 26 августа 2009

Итак, у меня есть таблица подписок:

id - int(11) (With Primary Key)
user_id - int(11)
group_id - int(11)
role - int(11)
pending - tinyint(1)
created_at - datetime
updated_at - datetime

Я часто делаю запросы, чтобы узнать, есть ли у пользователей права доступа, подобные этим:

SELECT * FROM `subscriptions` WHERE (group_id = 1 AND user_id = 2 AND pending = 0) LIMIT 1

Мне интересно, поможет ли в этом случае добавление уникального индекса на subscriptions(group_id, user_id, pending)? Каковы лучшие практики для индексации почти всей таблицы?

1 Ответ

1 голос
/ 26 августа 2009

Это, безусловно, поможет, особенно если вы замените * на 1 в своем запросе (если вы просто хотите проверить, существует ли строка).

Это может оказать небольшое влияние на DML.

Создание индекса фактически создает B-Tree, который имеет такую ​​структуру:

indexed_col1
indexed_col2
...
indexed_colN
row_pointer

в качестве ключа, row_pointer - смещение файла (для MyISAM) или значение строки PRIMARY KEY (для InnoDB)

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

Если ваши данные по сути уникальны, всегда полезно создать для них индекс UNIQUE. Это не так для MySQL, но более продвинутые оптимизаторы (например, SQL Server) могут использовать тот факт, что данные уникальны, и построить более эффективный план.

См. Эту статью в моем блоге для примера:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...