Pergunta

dizer que tenho duas tabelas, como os:

Employers (id, name, .... , deptId).
Depts(id, deptName, ...).

Mas esses dados não vai ser modificada tantas vezes e eu quero que uma consulta como esta

SELECT name, deptName FROM Employers, Depts 
    WHERE deptId = Depts.id AND Employers.id="ID"

ser tão rápido quanto possível.

Para minha cabeça vem duas soluções possíveis:

  • desnormalizar tabela:

    Apesar de que com esta solução vou perder algumas das grandes vantagens de ter "bases de dados normalizados, mas aqui o desempenho é uma obrigação.

  • Criar uma exibição para que os dados desnormalizar.

    Vou manter o Normalizado de dados e ( aqui é a minha pergunta ), o desempenho de uma consulta sobre essa visão será mais rápido que sem essa visão.

Ou uma outra maneira de fazer a mesma pergunta, a vista é "interpretado" cada vez que você faça uma consulta sobre ele, ou como trabalha os pontos de vista material em um DBA?.

Foi útil?

Solução

Geralmente, a menos que você "materializar" a vista, que é uma opção em algum software como o MS SQL Server, a vista é apenas traduzido para consultas contra as tabelas de base, e, portanto, não mais rápido ou mais lento do que o original (menos o minúscula quantidade de tempo que leva para traduzir a consulta, o que não é nada comparado a realmente executar a consulta).

Como você sabe que você tem problemas de desempenho? Você está perfilando-lo sob carga? Você verificou que o gargalo de desempenho é essas duas tabelas? Geralmente, até que você tem dados concretos, não assuma que você sabe onde os problemas de desempenho vêm, e não gastar todo o tempo otimizar até que você sabe que você está otimizando a coisa certa - 80% dos problemas de desempenho vêm de 20 % do código.

Outras dicas

Se Depts.ID é a chave primária da tabela, e você indexar o campo Employers.DeptID, então essa consulta deve permanecer muito rápido, mesmo ao longo de milhões de registros.

desnormalizar não faz sentido para mim nesse cenário.

De um modo geral, o desempenho de uma visualização será quase exatamente o mesmo que o desempenho ao executar a consulta em si. A vantagem de um ponto de vista é simplesmente abstrair essa consulta de distância, para que você não tem que pensar sobre isso.

Você pode usar uma visão materializada (ou "instantâneo" como dizem alguns), mas, em seguida, os dados só vai ser tão recente quanto a sua última atualização.

Em um comentário a uma das respostas, o autor da pergunta explica que está procurando uma maneira de criar uma visão materializada no MySQL.

MySQL não quebra o conceito de visão materializada em um pacote agradável para você como outros DBMSes, mas tem todas as ferramentas necessárias para criar uma.

O que você precisa fazer é esta:

  1. Criar a materialização inicial do resultado de sua consulta.
  2. Criar um gatilho de inserção na tabela de empregadores que se insere na materializou mesa todas as linhas que correspondem ao empregador recém-inserido.
  3. Criar um gatilho de exclusão na tabela de empregadores que exclui as linhas correspondentes na tabela materializou.
  4. Criar um gatilho de atualização na tabela de empregadores que atualiza as linhas correspondentes na tabela materializou.
  5. O mesmo para a tabela de departamentos.

Isso pode funcionar bem se suas tabelas subjacentes não são atualizados com freqüência; mas você precisa estar ciente do custo adicional de criar / atualizar / operações de exclusão depois de fazer isso. Além disso, você vai querer certificar-se de alguns DBA que não sabe sobre sua trapaça não vai migrar o banco de dados sem migrar os gatilhos, quando chega a hora. Então, documentá-lo bem.

soa como otimização prematura a menos que você sabe que é um problema claro e presente.

MySQL não se materializar vista, eles não mais rápido do que são consultas contra as tabelas base. Além disso, em alguns casos, eles são mais lentos à medida que se otimizado menos bem.

Mas vistas também coisas "esconder" a partir de desenvolvedores mantendo o código no futuro, para fazê-los imaginar que a consulta é menos complexo do que realmente é.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top