Поддерживают ли какие-либо базы данных автоматическое создание индекса? - PullRequest
24 голосов
/ 24 октября 2008

Почему базы данных не индексируют таблицы автоматически на основе частоты запросов? Существуют ли какие-либо инструменты для анализа базы данных и запросов, которые она получает, и автоматического создания или, по крайней мере, предложения по созданию индексов?

Меня особенно интересует MySQL, но мне было бы любопытно и другие базы данных.

Ответы [ 11 ]

13 голосов
/ 24 октября 2008

Это лучший вопрос, который я видел в stackoverflow. К сожалению, у меня нет ответа. Bigtable Google автоматически индексирует нужные столбцы, но BigTable не допускает произвольных объединений, поэтому проблемное пространство намного меньше.

Единственный ответ, который я могу дать, это:

Однажды кто-то спросил: «Почему компьютер не может просто анализировать мой код, а также компилировать и статически набирать фрагменты кода, которые выполняются чаще всего?»

Люди решают эту проблему сегодня (например, Тамарин в FF3.1), и я думаю, что «автоиндексация» реляционных баз данных - это тот же класс проблем, но это не так уж и приоритетно. Через десять лет ручное добавление индексов в базу данных будет считаться пустой тратой времени. На данный момент мы застряли в мониторинге медленных запросов и запуске оптимизаторов.

9 голосов
/ 24 октября 2008

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

Однако на самом деле это не тривиальная проблема, и когда эти средства впервые появились, пользователи иногда находили, что это на самом деле замедляет работу их баз данных из-за плохой оптимизации.

Наконец, в отрасли много денег для архитекторов баз данных, и они предпочитают статус-кво.

Тем не менее базы данных становятся все более интеллектуальными. Если вы используете профилировщик SQL-сервера с Microsoft SQL-сервером, вы найдете способы ускорить работу вашего сервера. Другие базы данных имеют аналогичные профилировщики, и для выполнения этой работы существуют сторонние утилиты.

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

-Adam

4 голосов
/ 24 октября 2008

MS SQL 2005 также поддерживает внутреннюю ссылку на предлагаемые индексы для создания на основе данных об использовании. Он не такой полный и точный, как Tuning Advisor, но он автоматический. Исследуйте dm_db_missing_index_groups для получения дополнительной информации.

3 голосов
/ 20 января 2009

Существует сценарий, который, я думаю, содержит блог MS SQL со сценарием для предложения индексов в SQL 2005, но сейчас я не могу найти точный сценарий! Это просто вещь из описания, насколько я помню. Вот ссылка на дополнительную информацию http://blogs.msdn.com/bartd/archive/2007/07/19/are-you-using-sql-s-missing-index-dmvs.aspx

PS только для SQL Server 2005 +

2 голосов
/ 25 ноября 2009

Да, некоторые движки поддерживают автоматическую индексацию. Одним из таких примеров для mysql является Infobright, их движок не поддерживает «обычные» индексы и вместо этого неявно индексирует все - это механизм хранения на основе столбцов.

Поведение таких движков, как правило, сильно отличается от того, что ожидают разработчики (и да, вам не нужно быть РАЗРАБОТЧИКОМ, чтобы даже думать об использовании Infobright; это не замена подключаемого модуля для стандартного движка).

2 голосов
/ 24 октября 2008

Для этого есть инструменты.

Для MS SQL используйте SQL Profiler (для записи операций с базой данных) и помощник по настройке ядра СУБД (SQL 2005) или мастер настройки индексов (SQL 2000) для анализа действий и рекомендации индексов или других улучшений.

1 голос
/ 14 февраля 2013

В Amazon SimpleDB есть автоматическая индексация всех столбцов в зависимости от вашего использования:

http://aws.amazon.com/simpledb/

Есть и другие ограничения:

  • Это хранилище значений ключей, а не RDB. Очевидно, это означает медленное соединение (и отсутствие встроенной поддержки соединения).
  • Он имеет ограничение в 10 ГБ на размер таблицы. Существуют библиотеки, которые будут обрабатывать разделение больших данных для вас, хотя это ограничивает вас в способе работы этой библиотеки, что может иметь свои собственные проблемы.
  • Он хранит все значения в виде строк, даже четных чисел, что позволяет сортировать столбец с 1,9, а 10 получается как 1,10,9, если только вы не используете библиотеку, которая взламывает это заполнением 0. Это также влияет на отрицательные числа.

Ограничение в 10 ГБ больше, чем многие могут предположить, поэтому вы можете перейти к этому для простого сайта, который вы планируете переписать, если он когда-нибудь достигнет большого значения.

К сожалению, этот вид автоматической индексации не попал в DynamoDb, который, похоже, заменил его - они даже не упоминают SimpleDb в своем списке продуктов, его нужно найти по старым ссылкам на него.

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

Кажется, что MySQL не имеет удобного профилировщика. Может быть, вы хотите попробовать что-то вроде this , класс php, основанный на MySQL profiler.

1 голос
/ 24 октября 2008

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

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

Я уверен, что мы получим больше инструментов, которые будут брать примеры запросов и определять, какие индексы необходимы; также, вероятно, мы в конечном итоге получим базы данных, которые будут выполнять то, что вы предлагаете, и будете отслеживать производительность и добавлять индексы, которые они сочтут необходимыми, но я не думаю, что они заменят начинание с правильных индексов.

1 голос
/ 24 октября 2008

Я согласен с тем, что Адам Дэвис говорит в своем комментарии. Я добавлю, что если бы существовал такой механизм для автоматического создания индексов, наиболее распространенной реакцией на эту функцию было бы: «Это хорошо ... Как мне его отключить?»

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