Spec-Zone.ru › MySQL 8.4

10.2.1 Оптимизация запросов SELECT

  • 10.2.1.1 Оптимизация условия WHERE
  • 10.2.1.2 Оптимизация диапазонов
  • 10.2.1.3 Оптимизация слияния индексов
  • 10.2.1.4 Оптимизация соединения Hash Join
  • 10.2.1.5 Оптимизация спуска условий движка
  • 10.2.1.6 Оптимизация спуска условий индексов
  • 10.2.1.7 Алгоритмы соединения Nested-Loop
  • 10.2.1.8 Оптимизация соединения Nested Join
  • 10.2.1.9 Оптимизация внешних соединений
  • 10.2.1.10 Упрощение внешних соединений
  • 10.2.1.11 Оптимизация многодиапазонного чтения (Multi-Range Read)
  • 10.2.1.12 Соединения с блочным вложенным циклом (Block Nested-Loop) и пакетным доступом к ключам (Batched Key Access)
  • 10.2.1.13 Фильтрация по условиям
  • 10.2.1.14 Оптимизация свёртки констант
  • 10.2.1.15 Оптимизация IS NULL
  • 10.2.1.16 Оптимизация ORDER BY
  • 10.2.1.17 Оптимизация GROUP BY
  • 10.2.1.18 Оптимизация DISTINCT
  • 10.2.1.19 Оптимизация запросов LIMIT
  • 10.2.1.20 Оптимизация вызова функций
  • 10.2.1.21 Оптимизация оконных функций
  • 10.2.1.22 Оптимизация выражений с конструктором строк
  • 10.2.1.23 Избегание полных сканирований таблиц

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

Помимо операторов SELECT, методы настройки запросов также применяются к конструкциям, таким как CREATE TABLE...AS SELECT, INSERT INTO...SELECT, и WHERE в операторах DELETE. Эти операторы имеют дополнительные соображения по производительности, потому что они сочетают операции записи с ориентированными на чтение операциями запроса.

NDB Cluster поддерживает оптимизацию спуска соединения, при которой полное условие соединения передается в узлы данных NDB Cluster, где оно может быть распределено между ними и выполнено параллельно. Более подробную информацию об этой оптимизации см. в разделе Условия для спуска соединений NDB.

Основные соображения для оптимизации запросов:

  • Чтобы ускорить медленный запрос SELECT ... WHERE, первое, что нужно проверить, — это возможность добавления индекса. Создайте индексы по столбцам, используемым в условии WHERE, для ускорения оценки, фильтрации и окончательного получения результатов. Чтобы избежать ненужного пространства на диске, создайте небольшой набор индексов, ускоряющих многие связанные запросы, используемые в вашем приложении.

    Индексы особенно важны для запросов, которые ссылаются на разные таблицы, используя функции, такие как и . Вы можете использовать оператор EXPLAIN для определения индексов, используемых для запроса SELECT. См. Раздел 10.3.1, «Как MySQL использует индексы» и Раздел 10.8.1, «Оптимизация запросов с помощью EXPLAIN».

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

  • Минимизируйте количество в ваших запросах, особенно для больших таблиц.

  • Регулярно обновляйте статистику таблиц с помощью оператора ANALYZE TABLE, чтобы оптимизатор имел необходимую информацию для построения эффективного плана выполнения.

  • Изучите методы настройки, техники индексирования и параметры конфигурации, специфичные для движка хранения каждой таблицы. Как InnoDB, так и MyISAM имеют наборы рекомендаций для обеспечения высокой производительности запросов. Подробнее см. в Разделе 10.5.6, «Оптимизация запросов InnoDB» и Разделе 10.6.1, «Оптимизация запросов MyISAM».

  • Вы можете оптимизировать транзакции с одним запросом для таблиц InnoDB, используя метод из Раздела 10.5.3, «Оптимизация транзакций только для чтения InnoDB».

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

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

  • Настройте размер и свойства областей памяти, которые MySQL использует для кэширования. С эффективным использованием InnoDB, MyISAM кэша ключей и кэша запросов MySQL повторные запросы выполняются быстрее, потому что результаты извлекаются из памяти во второй и последующие разы.

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

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

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/select-optimization.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API