В MySQL увеличивает ли производительность SELECT foo производительность при индексировании foo? - PullRequest
4 голосов
/ 04 сентября 2010

Увеличивает ли производительность SELECT foo в MySQL индексирование foo?

На RedditMirror.cc у меня есть база данных с 1,2 миллионами записей в таблице GrabbedSites, число которых увеличивается примерно на 500-2000 в день.

В начале своей карьеры мне было сказано, что только столбцы, которые должны быть проиндексированы, это те, которые вы

  1. будет делать ГДЕ или СОЕДИНЯТЬ ВЫБОР / ОБНОВЛЕНИЯ в будущем,
  2. нужны, чтобы они были УНИКАЛЬНЫМИ данными.

Из-за этого в GrabbedSites индексируется только один ключ (кроме первичного ключа): categoryID, но запрашивается 8 столбцов.

Сайт получает впечатляющие всплески флэш-трафика, иногда более 100 000 уникальных посетителей в день, и БД «облагается налогом» при использовании около 20%.

Поэтому мне интересно, будет ли в MySQL преимущество в производительности для добавления индексов ко всем 8 часто запрашиваемым столбцам ??


Редактировать: Запрос:

  SELECT url, 
         title, 
         published, 
         reddit_key, 
         UNIX_TIMESTAMP(last_fetched) last_fetched, 
         comment_link 
    FROM GrabbedSites 
   WHERE published BETWEEN DATE_SUB('2010-09-03', INTERVAL 1 DAY) 
                       AND '2010-09-03' 
ORDER BY published;

Только индекс «опубликован».

Объяснение говорит: используя где; Использование файловой сортировки

Ответы [ 2 ]

1 голос
/ 04 сентября 2010

Первое, что нужно знать, это то, что MySQL использует только один индекс для каждого psuedo-SELECT (не для оператора) - когда вы просматриваете вывод SELECT с помощью EXPLAIN, вы увидите, какой индекс был выбран для.EXPLAIN может быть запущен только на SELECTS, поэтому мы должны предположить, что DELETE / UPDATE использует тот же план, когда вы меняете синтаксис для SELECT ...

Большинство баз данных (встроенные могут быть нечетными) длямои знания подтверждают использование индексов в следующих пунктах:

  • SELECT
  • JOIN (синтаксис ANSI-92)
  • WHERE (потому что есть и ANSI-89 и здесь можно найти замену)
  • ИМЕЕТ (ГДЕ эквивалентно, но в отличие от ГДЕ - позволяет использовать агрегаты без необходимости подзапроса)
  • ЗАКАЗАТЬ

I 'Я не 100% на GROUP BY, поэтому я пока опускаю его.

В конечном счете, это выбор оптимизаторов для использования на основе его алгоритма и статистики, которая у него есть.Вы можете использовать синтаксис ANALYZE TABLE для обновления статистики (периодически, не постоянно, пожалуйста).

Добавление

MySQL также ограничивает объем пространства, выделяемого для выделения индексов - 1000 байт для таблиц MyISAM и 767 байт для таблиц InnoDB .Поскольку MySQL использует только один индекс на psuedo-SELECT, закрывающие индексы (индексы, включающие более одного столбца) - хорошая идея, но на самом деле речь идет о тестировании наиболее распространенного запроса и оптимизации его как можно лучше.Приоритет индексации должен быть:

  1. Первичный ключ (где-то в v5, создание индекса для ПК стало автоматическим)
  2. Внешние ключи (следующий наиболее вероятный кандидат JOIN
  3. Критерии фильтрации (при условии, что у вас есть место)
0 голосов
/ 04 сентября 2010

Если вы фильтруете по этим столбцам, которые планируете индексировать, вы можете получить повышение производительности.Поскольку ваша база данных в основном доступна только для чтения (вы получаете только 500-2000 новых строк в день, и вы, вероятно, не так много обновляете), вы можете дать ей шанс.Вы определенно не навредите своей базе данных, если добавите эти индексы.

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