Что такое выбор Big-O для SQL? - PullRequest
22 голосов
/ 28 августа 2009

Что такое выбор Big-O для SQL для таблицы с n строками и для которой я хочу вернуть m результат?

А что такое Big-O для операций Update, или delete, или Create?

Я имею в виду mysql и sqlite в целом.

Ответы [ 3 ]

42 голосов
/ 28 августа 2009

Поскольку вы не контролируете выбранный алгоритм, вы не можете узнать напрямую. Однако без индексов значение SELECT должно быть равно O (n) (сканирование таблицы должно проверять каждую запись, что означает, что она будет масштабироваться в соответствии с размером таблицы).

С индексом SELECT, вероятно, равен O (log (n)) (хотя это будет зависеть от алгоритма, используемого для индексации, и свойств самих данных, если это верно для любой реальной таблицы). Чтобы определить свои результаты для любой таблицы или запроса, вам нужно прибегнуть к профилированию данных реального мира, чтобы быть уверенным.

INSERT без индексов должен быть очень быстрым (близко к O (1)), в то время как UPDATE необходимо сначала найти записи и поэтому будет медленнее (немного), чем SELECT, который доставит вас туда.

INSERT с индексами, вероятно, снова будет в приблизительной точке O (log (n ^ 2)), когда дерево индексов необходимо перебалансировать, в противном случае ближе к O (log (n)). Такое же замедление будет происходить с UPDATE, если оно влияет на проиндексированные строки, в дополнение к затратам SELECT.

Все ставки отменяются, когда вы говорите о JOIN в миксе: вам придется профилировать и использовать свои инструменты оценки запросов к базам данных, чтобы прочитать их. Также обратите внимание, что если этот запрос критичен к производительности, вы должны время от времени профилировать re , так как алгоритмы, используемые оптимизатором запросов, будут меняться при изменении загрузки данных.

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

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

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

Я думаю, что реальный ответ может быть определен только в каждом конкретном случае (механизм базы данных, дизайн таблицы, индексы и т. Д.).

Однако, если вы являетесь пользователем MS SQL Server, вы можете ознакомиться с планом предполагаемого выполнения в Query Analyzer (2000) или Management Studio (2005+). Это дает вам много информации, которую вы можете использовать для анализа.

0 голосов
/ 28 августа 2009

Все зависит от того, как (хорошо) вы пишете свой SQL и насколько хорошо ваша база данных предназначена для выполняемой вами операции. Попробуйте использовать функцию объяснения плана, чтобы увидеть, как все будет выполняться БД. . Вы можете рассчитать Big-O

...