Методы оптимизации базы данных для любителей

StackOverflow https://stackoverflow.com/questions/2710007

  •  01-10-2019
  •  | 
  •  

Вопрос

Можем ли мы получить список основных методов оптимизации (что-либо от моделирования до запроса, создание индексов, представлений на оптимизацию запросов). Было бы неплохо иметь список этих, одна техника за ответ. Как хоббист, я бы нашел это, чтобы быть очень полезным, спасибо.

И ради того, чтобы не быть слишком расплывчатым, скажем, мы используем MySQL или Oracle, такие как MySQL или Oracle, и что DB будет содержать 500 000-1M или около того записи на ~ 10 таблицах, некоторые с вознаграждениями внешнего ключа, все использующие Наиболее типичные двигатели хранения (например, InnoDB для MySQL). И, конечно же, основы, такие как PKS, определены, а также навыки FK.

Это было полезно?

Решение

Узнайте о показателях и правильно используйте их. Вообще говоря *, следуйте этим рекомендациям:

  • Каждая таблица должна иметь кластерный индекс
  • Поля, используемые для фильтров и сортов, являются хорошими кандидатами для индексации
  • Более выборочный Поля лучшие кандидаты для индексации
  • Для достижения максимальной производительности на решающих запросах, дизайн «Покрытие индексов» для тех запросов
  • Убедитесь, что ваши индексы на самом деле используются и удаляют те, которые не являются
  • Если у вашего стола 15 полей, и вы делаете 15 индексов, каждая только с одним полем, вы делаете это неправильно :)

* Есть некоторые исключения из этих правил, если вы знаете, что вы делаете. Мой опыт - Microsoft SQL Server, но я бы предположил, что большая часть этого совета по-прежнему применяется к другому RDMS.

Другие советы

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

При разговоре Database Design, проверьте нормализацию базы данных, например статью Википедии: Нормальные формы.

Если у вас хороший дизайн, и все же вам нужно оптимизировать для производительности, попробуйте Денормализация.

Если у вас есть конкретные потребности, которые эффективно не покрываются реляционной моделью, посмотрите на другие модели, охватываемые термином Nosql..

Некоторые оптимизации запросов / схемы:

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

  • Будьте внимательны к левому присоединениям. Слишком часто я нахожу новые разработчики SQL, будут игнорировать схему на месте и использовать оставшиеся присоединения, где они действительно не нужны. Например:

Select
From Orders
    Left Join Customers
        On Customers.Id = Orders.CustomerId

Если Orders.Customerid - это требуемый столбец, то не нужно использовать левое соединение.

  • Быть студентом новых функций. В настоящее время MySQL не поддерживает высказывания общих таблиц, что означает, что некоторые типы запросов являются громоздкими и, возможно, медленнее писать, чем они были бы, если бы CTE были поддержаны. Однако это не будет правдой навсегда. Продолжайте вверх по новым функциям синтаксиса в MySQL, которые могут быть использованы для создания существующих запросов более эффективными.

  • Вам не нужно использовать суррогатные ключи везде. Там могут быть таблицы лучше подходят для интеллектуального ключа (например, сокращения государств США, коды валют и т. Д.), Что позволило бы разработчикам избежать дополнительных соединений во многих случаях.

  • Если возможно, найдите способы архивирования данных на сервер OLAP или отчетности. Чем меньше вы можете сделать продукты, тем быстрее он будет работать.

Конструкция, что кратко модели вашей проблемы всегда хорошее начало. Переназначивая модель данных может привести к проблемам с производительностью. Например, я слышал сообщения о проектах, стремящихся к Uber-гибкости, которая использует RDBMS в качестве тупания «Name / Value», а в результате производительность была ужасна.

Как только хороший дизайн на месте, затем используйте инструменты, предоставляемые RDBMS, чтобы помочь ему добиться хорошей производительности. Одиночное поле PKS (без композитов), но композитные бизнес-ключей как индекс с уникальным ограничением, использование соответствующих типов данных, например, с использованием соответствующих числовых типов для числовых значений, а не CHAR или аналогичных. Физические атрибуты аппаратного обеспечения RDBMS запускается также, поскольку объем времени запроса часто является диск ввода / вывода - но, конечно, не принимайте это как должное - используйте профилировщик, чтобы узнать, где идет время Отказ

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

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

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

Использовать меньше запроса как только возможно. Используйте «Присоединиться» и группируйте свои таблицы, чтобы один запрос давал вашим результатам.

Хороший пример Модифицированное преобразование дерева трансверсальное (Мантия) Чтобы получить все родители узела дерева, заказанные, в одном запросе.

Возьмите целостный подход к оптимизации.

Рассмотрим влияние медленных дисков, сетевой задержки, отсутствия памяти и нагрузки на сервер.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top