Поскольку для изменения индекса в моей 40-миллионной таблице строк требуется вечность, я надеялся получить некоторую обратную связь, чтобы убедиться, что я делаю это правильно с первого раза.
В данный момент у моей таблицы "Избранное" есть 3 индекса:
- Первичный индекс автоинкремента включен (id)
- item_idx (item_id) - идентификатор элемента, который был добавлен в избранное
- faver_id_idx (faver_profile_id, id) - для отображения избранных от конкретного пользователя, начиная с самого последнего.
Чтобы проверить, «выбрал» ли пользователь конкретный элемент, я использую этот запрос:
SELECT id FROM favorites
WHERE item_id = '.mysql_real_escape_string($item_id).'
AND faver_profile_id = '.mysql_real_escape_string($user['id']).'
AND removed = 0
Что делает целое:
Using intersect(item_idx,faver_id_idx)
Это кажется мне неэффективным, поэтому я рассматриваю следующую настройку индекса:
- Первичный индекс автоинкремента при (id)
- item_faver_idx (item_id, удален, faver_profile_id)
- faver_id_idx (faver_profile_id, удалено, id)
Я вижу следующие преимущества:
- Я могу проверить, ударил ли пользователь элемент без пересечения или сортировки по таблице.
- Столбец "удален" (tinyint) теперь является частью индекса.
У меня есть вопросы:
В индексе (item_id ,ched, faver_profile_id) есть причина, по которой вместо него должен стоять faver_profile_id? Например, если я делаю следующий запрос ..
SELECT items.*, users.*, favorites.item_id
FROM items
LEFT JOIN users ON (items.submitter_id = users.id)
LEFT JOIN favorites ON (items.id = favorites.item_id AND favorites.faver_profile_id = 56 AND favorites.removed = 0)
ORDER BY items.id desc LIMIT 26
Было бы лучше, чтобы faver_profile_id был первым в индексе, чтобы он мог просто перейти к правому разделу faver_profile_id индекса вместо того, чтобы проверять несколько разделов item_id, а затем сканировать для faver_profile_id в каждом из этих разделов?
- Имеет ли смысл «удалить» в индексе, если только 1-3% строк имеют удаленное значение 1? По сути, стоит ли более эффективное сканирование таблиц дополнительного индекса?
Что-нибудь, что я пропускаю?