Quando usar visualizações no MySQL?

54

Ao criar tabelas a partir de várias junções para uso em análise, quando é preferível usar visualizações em vez de criar uma nova tabela?

Uma razão pela qual eu preferiria usar visualizações é que o esquema do banco de dados foi desenvolvido por nosso administrador no Ruby, e eu não estou familiarizado com o Ruby. Posso solicitar a criação de tabelas, mas requer uma etapa adicional e gostaria de mais flexibilidade ao desenvolver / testar novas junções.

Comecei a usar visualizações após a resposta a uma pergunta relacionada sobre SO ( quando usar R, quando usar SQL ). A resposta mais votada começa "faça as manipulações de dados no SQL até que os dados estejam em uma única tabela e depois faça o resto em R."

Comecei a usar modos de exibição, mas tive alguns problemas com os modos de exibição:

  1. consultas são muito mais lentas
  2. As visualizações não são despejadas da produção para o banco de dados de backup que eu uso para análise.

As visualizações são apropriadas para esse uso? Em caso afirmativo, devo esperar uma penalidade de desempenho? Existe uma maneira de acelerar as consultas sobre visualizações?

David LeBauer
fonte
Parece que as visualizações são apropriadas aqui, mas não tenho certeza do que pode estar causando a desaceleração ao consultá-las.
FrustratedWithFormsDesigner
@FrustratedWithFormsDesigner, existem diagnósticos que ajudariam (além de criar um exemplo reproduzível)? A mesma consulta complexa leva <4s quando feita diretamente em tabelas unidas e> 25s quando feita em visualizações. Espera-se que as visualizações não tenham uma penalidade de desempenho?
David LeBauer
Já faz muito tempo desde que eu usei o MySQL, então eu realmente não posso dizer.
FrustratedWithFormsDesigner
Eu uso o MySQL e eu dir-lhe vistas são terríveis, inutilizável quando você chegar a 100K e acima, é só usar consultas em linha reta, onde você tem controle sobre quais campos para retornar e que se junta a usar
Stephen Senkomago Musoke

Respostas:

43

As visualizações no MySQL são tratadas usando um de dois algoritmos diferentes: MERGEou TEMPTABLE. MERGEé simplesmente uma expansão de consulta com aliases apropriados. TEMPTABLEé exatamente o que parece, a exibição coloca os resultados em uma tabela temporária antes de executar a cláusula WHERE e não há índices nela.

A opção 'terceiro' é UNDEFINED, que diz ao MySQL para selecionar o algoritmo apropriado. O MySQL tentará usar MERGEporque é mais eficiente. Advertência principal:

Se o algoritmo MERGE não puder ser usado, uma tabela temporária deverá ser usada. MERGE não pode ser usado se a exibição contiver qualquer uma das seguintes construções:

  • Funções agregadas (SUM (), MIN (), MAX (), COUNT () e assim por diante)

  • DISTINCT

  • GRUPO POR

  • TENDO

  • LIMITE

  • UNION ou UNION ALL

  • Subconsulta na lista de seleção

  • Refere-se apenas a valores literais (neste caso, não há tabela subjacente)

[src]

Atrevo-me a supor que suas VIEWS estão exigindo o algoritmo TEMPTABLE, causando problemas de desempenho.

Aqui está um post realmente antigo sobre o desempenho das visualizações no MySQL e parece que não ficou melhor.

No entanto, pode haver alguma luz no final do túnel sobre esse problema de tabelas temporárias que não contêm índices (causando varreduras completas de tabela). Na versão 5.6 :

Nos casos em que a materialização é necessária para uma subconsulta na cláusula FROM, o otimizador pode acelerar o acesso ao resultado adicionando um índice à tabela materializada. ... Após adicionar o índice, o otimizador pode tratar a tabela derivada materializada da mesma forma que uma tabela usual com um índice, e se beneficia da mesma forma que o índice gerado. A sobrecarga da criação do índice é insignificante em comparação com o custo da execução da consulta sem o índice.

Como aponta o @ypercube, o MariaDB 5.3 adicionou a mesma otimização. Este artigo tem uma visão geral interessante do processo:

Como a otimização é aplicada, a tabela derivada não pode ser mesclada em seu SELECT pai, o que acontece quando a tabela derivada não atende aos critérios para VIEW mesclável

Derek Downey
fonte
Eu fiz nenhum teste sobre essas reivindicações, mas MariaDB 5.3 (lançado recentemente como estável) tem algumas grandes melhorias no otimizador, incluindo Exibições :Fields of merge-able views and derived tables are involved now in all optimizations employing equalities
ypercubeᵀᴹ
@ypercube obrigado por esse link ... parece que o MySQL 5.6 tem pelo menos a otimização de adicionar um índice às tabelas derivadas.
Derek Downey
14

As visualizações são ferramentas de segurança. Você não deseja que um usuário ou aplicativo em particular saiba onde está sua tabela de dados; você fornece uma visualização com apenas as colunas necessárias.

Lembre-se de que as exibições sempre degradam o desempenho; consultas semelhantes devem ser procedimentos e funções armazenados, não exibições.

Para fazer um ajuste de consulta, sempre siga as práticas recomendadas, evite usar funções nas cláusulas WHERE, crie índices para acelerar seleções, mas não abuse, pois os índices degradam inserções, atualizações e exclusões.

Existe uma boa documentação que pode ajudá-lo: http://www.toadworld.com/LinkClick.aspx?fileticket=3qbwCnzY/0A=&tabid=234

Rainier Morilla
fonte
5
Não concordo que as visualizações sejam (apenas) ferramentas de segurança. Eles podem ser usados ​​dessa maneira, mas nós os usamos para remover a complexidade das consultas que nossos desenvolvedores de relatórios usam regularmente.
JHFB 11/04
2
@JHFB: Eu concordo com você, mas talvez seja apenas assim que funciona no MySQL, onde parece que a visualização incorre em graves penalidades de desempenho?
FrustratedWithFormsDesigner
@frustratedwithformsdesigner grande ponto - já faz um tempo desde que eu usei o MySQL.
JHFB
11
As visualizações @JHFB no Mysql são um grande problema! mysqlperformanceblog.com/2007/08/12/…
Rainier Morilla
2
@RainierMorilla Views degradam o desempenho !! ??
Suhail Gupta
-2

Eu acho que visualizações são a estrutura predefinida (sem dados) para mesclar tabelas em uma para superar de várias consultas de tabela, que podem ser usadas a partir de dados reais para consultas relacionais rápidas ...

Shahzad Shaikh
fonte
2
Não está muito claro o que você está tentando explicar e como isso resolve os problemas descritos na postagem original. Você pode reler a pergunta, mas, de qualquer forma, considere expandir sua resposta para esclarecer como ela pode ser aplicada ao problema do OP.
Andriy M