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






Для этого есть инструменты.
Для MS SQL используйте профилировщик SQL (для записи активности в базе данных) и помощник по настройке ядра СУБД (SQL 2005) или мастер настройки индекса (SQL 2000), чтобы проанализировать действия и рекомендовать индексы или другие улучшения.
Google App Engine делает это (см. Файл index.yaml).
Существуют оптимизаторы баз данных, которые можно включить или присоединить к базам данных, чтобы предлагать (а в некоторых случаях выполнять) индексы, которые могут помочь.
Однако на самом деле это не тривиальная проблема, и когда эти средства впервые появились, пользователи иногда обнаруживали, что они фактически замедляют работу их баз данных из-за плохой оптимизации.
Наконец, в отрасли есть много денег для архитекторов баз данных, и они предпочитают статус-кво.
Тем не менее, базы данных становятся более интеллектуальными. Если вы используете профилировщик SQL-сервера с сервером Microsoft SQL, вы найдете способы ускорить работу своего сервера. В других базах данных есть аналогичные профилировщики, и есть сторонние утилиты для выполнения этой работы.
Но если вы пишете запросы, надеюсь, вы знаете достаточно о том, что делаете, чтобы индексировать нужные поля. Если нет, то правильные индексы, вероятно, меньшая из ваших проблем ...
-Адам
@ Адам Дэвис: «Но если вы пишете запросы, надеюсь, вы знаете достаточно о том, что делаете, чтобы индексировать правильные поля. Если нет, то наличие правильных индексов, вероятно, будет наименьшей из ваших проблем» - отсутствие правильные индексы описывают значительную часть всех существующих баз данных ...
Простой сценарий SQL здесь выводит собственные внутренние метрики SQL Server со списком индексов и предполагаемой выгодой от их создания - работает в 2005, 2008 и 2012 годах: blogs.msdn.com/b/bartd/archive/2007/07/19/…
MS SQL 2005 также поддерживает внутреннюю ссылку предлагаемых индексов для создания на основе данных об использовании. Он не такой полный и точный, как советник по настройке, но работает автоматически. Для получения дополнительной информации изучите dm_db_missing_index_groups.
Я согласен с тем, что Адам Дэвис говорит в своем комментарии. Я добавлю, что если бы существовал такой механизм для автоматического создания индексов, наиболее распространенной реакцией на эту функцию было бы: «Это хорошо ... Как мне ее выключить?»
Это лучший вопрос, который я видел в stackoverflow. К сожалению, у меня нет ответа. Bigtable Google автоматически индексирует правильные столбцы, но BigTable не допускает произвольных объединений, поэтому проблемное пространство намного меньше.
Единственный ответ, который я могу дать, таков:
Однажды кто-то спросил: «Почему компьютер не может просто проанализировать мой код, скомпилировать и статически ввести фрагменты кода, которые выполняются чаще всего?»
Люди решают эту проблему сегодня (например, Tamarin в FF3.1), и я думаю, что "автоиндексирование" реляционных баз данных - это тот же класс проблем, но это не такой приоритет. Через десять лет добавление индексов в базу данных вручную будет считаться пустой тратой времени. На данный момент мы застряли в мониторинге медленных запросов и запущенных оптимизаторов.
Если бы был один правильный ответ, база данных уже сделала бы это. Всегда есть компромисс. У вас может быть сотни индексов, и запросы всегда будут выполняться быстро, но вставки и обновления будут перетаскивать. Как лучше? Если ваш запрос выполняется часто, это не означает, что это самая важная для вас работа.
@Mark Brady: внимание: это всегда компромисс.
Этот ответ был написан в 2008 году ... это почти 2018 год, и мы все еще находимся там, где были тогда ... добавление ручных индексов и поиск в Google, чтобы увидеть, было ли какое-либо движение в этом пространстве. Безумно правда?
@degenerate Прошло уже больше десяти лет ... возможно, стоит обновить ответ, указав «два десятилетия», или перечислить текущие возможности (нет?).
Отчасти причина может заключаться в том, что индексы не просто дают небольшое ускорение. Если у вас нет подходящего индекса для большой таблицы, запросы могут выполняться так медленно, что приложение становится полностью непригодным для использования, и, возможно, если оно взаимодействует с другим программным обеспечением, оно просто не будет работать. Поэтому вам действительно нужно, чтобы индексы были правильными, прежде чем вы начнете пытаться использовать приложение.
Кроме того, вместо того, чтобы создавать индекс в фоновом режиме и еще больше замедлять работу во время его создания, лучше определить индекс до того, как вы начнете добавлять значительные объемы данных.
Я уверен, что мы получим больше инструментов, которые будут брать образцы запросов и определять, какие индексы необходимы; также, вероятно, в конечном итоге мы получим базы данных, которые будут работать так, как вы предлагаете, отслеживать производительность и добавлять индексы, которые, по их мнению, необходимы, но я не думаю, что они станут заменой для начала с правильных индексов.
Я думаю, что в блоге 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 +
Кажется, что у MySQL нет удобного профилировщика. Может быть, вы хотите попробовать что-то вроде это, класса php, основанного на профилировщике MySQL.
Да, некоторые движки поддерживают автоматическое индексирование. Одним из таких примеров для mysql является Infobright, его движок не поддерживает «обычные» индексы, а вместо этого неявно индексирует все - это механизм хранения на основе столбцов.
Поведение таких движков имеет тенденцию сильно отличаться от того, что ожидают разработчики (и да, вам не нужно быть РАЗРАБОТЧИКОМ, чтобы даже думать об использовании Infobright; это не замена плагина для стандартного движка).
SimpleDB от Amazon имеет автоматическую индексацию всех столбцов в зависимости от вашего использования:
http://aws.amazon.com/simpledb/
Однако у него есть и другие ограничения:
Предел в 10 ГБ больше, чем многие могут предположить, поэтому вы можете продолжить его для простого сайта, который вы планируете переписать, если он когда-либо станет большим.
К сожалению, такого рода автоматическая индексация не попала в DynamoDb, который, похоже, заменил его - они даже не упоминают SimpleDb в своем списке продуктов, вы должны найти его по старым ссылкам на него.
Какое глупое заявление: «архитекторы баз данных предпочитают статус-кво». Да, мы большой картель, который пресекает все попытки самоиндексирования баз данных. Например, простое устройство, которое вы добавляете к своей машине, чтобы получить 100 миль на галлон, которые нефтяные компании скрывают от нас.