2012-04-24 4 views
51

Если вы идете по дороге, используя виды, как вы можете обеспечить хорошую производительность?Просмотров MySql

Или лучше не использовать виды в первую очередь и просто включить эквивалент в ваши предложения?

+5

Я нашел [эту статью в блоге] (http://www.mysqlperformanceblog.com/2007/08/12/mysql-view-as-performance-troublemaker/) Петра Зайцева довольно информативным в прошлом. – eggyal

+0

@eggyal - Спасибо, будет читать и думать –

+0

Проверьте также недавнее ** [MariaDB 5,3] (http://kb.askmonty.org/en/what-is-mariadb-53) ** (и 5,5), которые имеют несколько улучшений в оптимизаторе, включая Views. –

ответ

79

От этого зависит.

Это полностью зависит от того, что вы просматриваете через просмотр. Но, скорее всего, сокращение ваших усилий и повышение производительности. Когда оператор SQL ссылается на неиндексированное представление, оптимизатор синтаксического анализатора и запроса анализирует источник как оператора SQL, так и представления, а затем разрешает их в один план выполнения. Существует не один план для оператора SQL и отдельный план для представления.

Взгляд не скомпилирован. Его виртуальная таблица состоит из других таблиц. Когда вы его создаете, он не находится где-то на вашем сервере. Основные запросы, составляющие представление, подвержены тем же результатам производительности или настройкам оптимизатора запросов. Я никогда не тестировал производительность в представлении VS по его базовому запросу, но я бы предположил, что производительность может незначительно отличаться. Вы можете повысить производительность на индексированном представлении, если данные относительно статичны. Это может быть то, о чем вы думаете, возможно, в терминах «скомпилированных».

Преимущества просмотров:

  1. Просмотр данных без сохранения данных в объект.
  2. Ограничить представление таблицы, то есть может скрывать некоторые столбцы в таблицах.
  3. Соедините две или более таблицы и покажите их как один объект для пользователя.
  4. Ограничить доступ к таблице, чтобы никто не мог вставлять строки в таблицу.

Смотрите эти полезные ссылки:

  1. Performance of VIEW vs. SQL statement
  2. Is a view faster than a simple query?
  3. Mysql VIEWS vs. PHP query
  4. Are MySql Views Dynamic and Efficient?
  5. Materialized View vs. Tables: What are the advantages?
  6. Is querying over a view slower than executing SQL directly?
  7. A workaround for the performance problems of TEMPTABLE views
  8. See performance gains by using indexed views in SQL Server
+1

Вы упоминаете индексированные представления и у вас есть несколько ссылок на индексированные и материализованные представления статей. Все хорошо и хорошо. Но имеет ли MySQL индексированные представления? –

+4

В настоящее время MySQL не поддерживает индексированные представления. –

+2

Хороший ответ. Я просто добавлю, что представление в основном является именованным запросом в MySQL. Если вы убедитесь, что запрос, генерирующий представление, имеет хорошую производительность при запуске сам по себе, то представление должно выполняться аналогичным образом. –

6

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

Обычно я использую представления, чтобы показать другой аспект таблицы. Например, в таблице моих сотрудников я показываю менеджерам или скрываю поле зарплаты от сотрудников без HR. Также всегда убедитесь, что вы запускаете EXPLAIN в запросе и просмотре, чтобы точно понять, что происходит внутри MySQL.

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

3

Если мы обсуждаем «если вы используете представления, как обеспечить производительность», а не эффект представления представлений в целом, я думаю, что это сводится к сдержанности (как в себе).

Вы можете столкнуться с большими неприятностями, если просто написать мнения, чтобы сделать ваш запрос простым во всех случаях, но не заботьтесь о том, чтобы ваши взгляды на самом деле были полезными по производительности. Любой запрос, который вы делаете в конце, должен быть работоспособным (см. Пример комментария из этой ссылки by @eggyal). Конечно, это тавтология, но, следовательно, не менее ценная.

Вам особенно нужно быть осторожным, чтобы не делать вид из представлений, просто потому, что это упростило бы сделать этот вид.

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

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

4

Вот краткое описание tl; dr, вы можете найти подробные оценки от Петра Зайцева и в других местах.

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

Лучше всего избегать их и хранить свои запросы в коде.

+1

Я хотел бы видеть этот комментарий перед своей командой, и я положил все эти взгляды с большим количеством объединений на нашей производственной базе данных:/ – Ralph

6

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

3

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

Как уже упоминалось выше, точки зрения не находятся в вашей БД но перестраивать каждый раз. Таким образом, все, что облегчает перестройку БД, увеличивает производительность представления.

Часто просмотры объединяют данные очень плохо для хранения (нет нормальной формы), но очень полезны для дальнейшего использования (выполняют анализ, представляют данные пользователю, ...) и тем самым объединяют и агрегируют данные из разных столы.

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

! Индексируйте все столбцы, используемые в предложениях JOINS и GROUP BY в инструкции CREATE VIEW!

Смежные вопросы