Подтвердить что ты не робот

Поддерживает ли база данных автоматическое создание индексов?

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

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

4b9b3361

Ответ 1

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

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

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

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

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

-Adam

Ответ 2

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

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

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

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

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

Ответ 9

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

Ответ 10

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

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

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

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

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

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