Соответствуют ли эти изменения индекса таблицы MySQL? - PullRequest
1 голос
/ 30 января 2012

Поскольку для изменения индекса в моей 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? По сути, стоит ли более эффективное сканирование таблиц дополнительного индекса?

Что-нибудь, что я пропускаю?

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