Является ли более эффективным делать запросы из представления в базе данных, чем из таблицы? - PullRequest
5 голосов
/ 17 сентября 2011

Предположим, у меня есть таблица A, создающая представление V из этой таблицы.

Затем я делаю несколько запросов от V. Интересно, будет ли V перестраиваться каждый раз, когда я делаю запрос? или оно будет построено только 1 раз и будет сохранено где-то в памяти СУБД для следующих запросов (что я думаю, аналогично запросу из таблицы)?

Ответы [ 4 ]

2 голосов
/ 17 сентября 2011

В общем, нет. V - это временный набор строк, который вычисляется по запросу. Поскольку вы можете применять дополнительные критерии WHERE и ORDER BY при запросах из представления, план выполнения для двух запросов к одному и тому же представлению может быть совершенно другим. Как правило, база данных не может повторно использовать результаты предыдущего запроса для представления, чтобы удовлетворить следующий запрос для этого представления.

Тем не менее, в некоторых движках существует относительно новая технология, которая называется Materialized Views. Я никогда не использовал их сам, но, насколько я понимаю, эти представления предварительно вычисляются на основе обновлений, которые вносятся в базовые таблицы. Таким образом, с Materialize Views вы получаете улучшенную производительность SELECT, но за счет снижения производительности INSERT, UPDATE и DELETE.

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

1 голос
/ 19 сентября 2011

Представления в MySQL не являются де-факто решением для кэширования.

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

В результате нет необходимости «обновлять» представление, как при использовании материализованных представлений в Oracle Microsoft SQL Server.Даже SQL в определении представления MySQL переоценивается каждый раз, когда вы запрашиваете представление.

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

  • FlexViews написан на PHP и поэтому имеет некоторые ограничения производительности.В зависимости от нагрузки трафика записи, FlexViews могут не поддерживать работу.
  • Он не поддерживает все возможные типы запросов SELECT.
  • Управляемые FlexViews таблицы материализованных представлений не обновляются.То есть вы можете ОБНОВИТЬ эту таблицу представления, но изменение не будет применяться к базовым таблицам.
0 голосов
/ 17 сентября 2011

Mysql Views не поддерживают индексы.(как в Oracle, где вы можете создавать индексы в Oracle Views) Но представления mysql могут использовать индексы в базовой таблице при создании с помощью алгоритма слияния.

Если вам нужно использовать представления, то настройте свой JOIN BUFFER.

Использование, как-то так

set global join_buffer_size = 314572800;

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

0 голосов
/ 17 сентября 2011

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

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

...