Может ли сложный запрос sql когда-либо становиться настолько сложным, что было бы более машинно-эффективным выполнять несколько запросов? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть такое чувство, что - если не считать написанных запросов в стороне, - получение необходимой информации из базы данных всегда быстрее, чем меньше запросов вы делаете для этого. Я не знаю, откуда я взял эту идею, и она становится более сложной, чем сложнее выполняемые мной запросы (действительно ли я делаю MySQL какие-либо услуги со всеми этими объединениями?). Я не спрашиваю мнение программиста о легкости или лучших методах кодирования, но существуют ли условия, при которых программа будет работать быстрее, если запрос разбит на несколько этапов? Если так, как можно сделать обоснованное предположение, что запрос может достичь такого верхнего предела, прежде чем предпринимать усилия по кодированию и сравнению?

1 Ответ

1 голос
/ 24 апреля 2020

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

Это может помочь, когда подзапрос повторяется в запросе несколько раз. Промежуточная таблица гарантирует, что она обрабатывается только один раз (хотя CTE обычно делает то же самое).

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

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

Что более важно, по мере изменения данных изменение запросов может быть проблемой. Я считаю, что изменение имени столбца, например, проще в одном запросе, чем когда логика c распределена по нескольким запросам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...