Когда при создании таблиц из нескольких объединений для использования в анализе предпочтительнее использовать представления, а не создавать новую таблицу?
Одна из причин, по которой я предпочел бы использовать представления, заключается в том, что схема базы данных была разработана нашим администратором из Ruby, и я не знаком с Ruby. Я могу попросить, чтобы таблицы были созданы, но требует дополнительного шага, и я хотел бы больше гибкости при разработке / тестировании новых объединений.
Я начал использовать представления после ответа на связанный вопрос о SO ( когда использовать R, когда использовать SQL ). Ответ, получивший наибольшее количество голосов, начинается: «выполняйте манипуляции с данными в SQL до тех пор, пока данные не окажутся в одной таблице, а затем сделайте все остальное в R.»
Я начал использовать представления, но столкнулся с несколькими проблемами с представлениями:
- запросы гораздо медленнее
- Представления не выгружаются из рабочей базы данных в резервную копию, которую я использую для анализа.
Подходят ли представления для этого использования? Если да, то следует ли ожидать снижения производительности? Есть ли способ ускорить запросы на просмотры?
источник
Ответы:
Представления в MySQL обрабатываются с использованием одного из двух разных алгоритмов:
MERGE
илиTEMPTABLE
.MERGE
это просто расширение запроса с соответствующими псевдонимами.TEMPTABLE
как бы это ни звучало, представление помещает результаты во временную таблицу перед выполнением предложения WHERE, и для него нет индексов.Третья опция - это
UNDEFINED
, что говорит MySQL выбрать подходящий алгоритм. MySQL попытается использовать,MERGE
потому что это более эффективно. Главное предостережение:Я бы рискнул предположить, что ваши VIEWS требуют алгоритма TEMPTABLE, вызывающего проблемы с производительностью.
Вот очень старая запись в блоге о производительности просмотров в MySQL, и она, похоже, не стала лучше.
Однако в конце туннеля может появиться некоторый свет по этой проблеме временных таблиц, не содержащих индексы (вызывающих полное сканирование таблиц). В 5.6 :
Как указывает @ypercube, MariaDB 5.3 добавила такую же оптимизацию. Эта статья имеет интересный обзор процесса:
источник
Fields of merge-able views and derived tables are involved now in all optimizations employing equalities
Представления являются инструментами безопасности. Вы не хотите, чтобы конкретный пользователь или приложение знали, где находится ваша таблица данных, вы предоставляете представление только с нужными столбцами.
Помните, что представления всегда ухудшают производительность, похожие запросы должны быть хранимыми процедурами и функциями, а не представлениями.
Чтобы настроить запрос, всегда следуйте рекомендациям, избегайте использования функций в предложениях WHERE, создавайте индексы для ускорения выбора, но не злоупотребляйте им, индексы ухудшают операции вставки, обновления и удаления.
Существует хорошая документация, которая может вам помочь: http://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234
источник
я думаю, что представления являются предопределенной структурой (без данных) для объединения таблиц в одну, чтобы преодолеть запрос к нескольким таблицам, который можно использовать из реальных данных для быстрого реляционного запроса ...
источник