2008-10-23 3 views
24

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

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

ответ

9

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

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

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

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

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

-Adam

+12

Какое глупое заявление «архитекторы баз данных предпочитают статус-кво».Да, мы большой картель, который подавляет каждую попытку сделать базу данных самоиндексированием. Как и простое устройство, которое вы добавляете в свой автомобиль, чтобы получить 100 миль на галлон, что нефтяные компании прячутся от нас. – 2008-10-24 14:55:55

+4

@Adam Davis: «Но если вы тот, кто пишет запросы, надеюсь, вы знаете достаточно о том, что вы делаете, чтобы индексировать правильные поля. Если нет, то правильные индексы, скорее всего, являются наименьшей из ваших проблем» - не наличие правильных индексов описывает значительную долю всех баз данных ... – 2009-01-20 13:29:03

2

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

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

4

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

1

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

13

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

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

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

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

1

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

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

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

3

Существует сценарий, который я считаю блогом 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 +

1

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

2

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

Поведение таких двигателей имеет тенденцию сильно отличаться от того, что разработчики (И да, вам нужно, чтобы DEVELOPER даже думал об использовании Infobright, это не замена плагинов для стандартного двигателя).

1

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

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

Он имеет другие ограничения, хотя:

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

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

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