Как оценить сложность SQL-запросов

Любой ресурс, где объясняется, как оценивать сложность SQL-запросов, будет высоко оценен.

Большинство, если не все СУБД, позволяют вам получить плановую информацию о запросе. Хотя простой на вид sql может привести к сложному плану и наоборот, тем не менее, он может быть хорошей отправной точкой.

Lieven Keersmaekers 21.12.2020 11:53

Если вы имеете в виду, как я могу оценить, насколько сложным должен быть запрос для выполнения задачи, я думаю, что вопрос не по теме для этого сайта, пожалуйста, прочитайте stackoverflow.com/help/on-topic , чтобы узнать, что вы можете спросить и прочитать en.wikipedia.org/wiki/…. в качестве основы для теории вычислительной сложности

P.Salmon 21.12.2020 13:57

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

P.Salmon 21.12.2020 13:57
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
449
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ознакомьтесь с официальной документацией MySQL по плану выполнения запросов: https://dev.mysql.com/doc/refman/5.7/en/execution-plan-information.html

Вы можете использовать команду EXPLAIN, чтобы получить больше информации о вашем запросе.

Ответ принят как подходящий

(Я предполагаю, что под «сложностью» вы подразумеваете «медленность»?) Несколько советов:

  • Подзапросы могут или не могут сильно замедлить запрос.
  • GROUP BY и ORDER BY -- когда присутствуют оба, но разные: обычно требуется два вида.
  • Обычно для SELECT используется только один индекс.
  • OR почти всегда неэффективен. Переключение на UNION позволяет эффективно использовать несколько индексов.
  • UNION ALL, с некоторыми ограничениями, более эффективен, чем UNION DISTINCT (из-за прохода дедупликации)
  • Выражения, не подлежащие анализу, не могут использовать индекс, поэтому они крайне неэффективны.
  • Если все WHERE, GROUP BY и ORDER BY обрабатываются одним индексом, можно эффективно обрабатывать LIMIT. (Иначе он должен собрать весь материал, отсортировать его, и только тогда он сможет отклеить несколько рядов.)
  • Схема Entity-Attribute-Value неэффективна.
  • UUID и GUID неэффективны для очень больших таблиц.
  • Составной индекс часто лучше, чем индекс с одним столбцом.
  • «Покрывающий» индекс несколько лучше.
  • Иногда, особенно когда речь идет о LIMIT, лучше вывернуть запрос наизнанку. То есть начните с подзапроса, который находит несколько ids, которые вам нужны, а затем возвращается к той же таблице и другим таблицам, чтобы получить остальные нужные столбцы.
  • «Оконные функции» плохо реализованы в MySQL 8 и MariaDB 10.2. Они полезны для "groupwise-max" и "иерархических схем". Пока Оптимизатор не улучшится, я объявляю их «сложными».
  • Последние версии распознали «конструкторы строк»; ранее они были хитом исполнения.
  • В некоторых случаях наличие идентификатора AUTO_INCREMENT снижает производительность; помогает в других.

EXPLAIN (или EXPLAIN FORMAT=JSON) говорит вам, что происходит сейчас; он не может сказать вам, как переписать запрос или какой лучший индекс добавить.

Дополнительные советы по индексированию: http://mysql.rjweb.org/doc.php/index_cookbook_mysql В этой ссылке см. «Число обработчиков», чтобы узнать, как измерить сложность конкретных запросов. Я использую его для сравнения формулировок запросов и т. д., даже не заполняя большую таблицу, чтобы получить удобные тайминги.

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

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