Pergunta

Eu tenho alguns SQL semelhante à seguinte, que se junta quatro tabelas e, em seguida, ordena os resultados pela coluna "status" da primeira:

SELECT * 
 FROM a, b, c, d 
 WHERE b.aid=a.id AND c.id=a.cid AND a.did=d.id AND a.did='XXX'
 ORDER BY a.status

Ele funciona. No entanto, é lento. Eu trabalhei fora isso é por causa da cláusula ORDER BY ea falta de qualquer índice na tabela "a".

Todas as quatro tabelas têm as chaves primárias definidas na coluna "id".

Então, eu sei que eu preciso para adicionar um índice para a tabela a que inclui a coluna "status", mas o que mais ele precisa incluir? Deve "bid", "cid" e "se" estar lá também?

Eu tentei perguntar isso em um sentido SQL geral, mas, se for importante, a meta é SQLite para uso com o Gears.

Agradecemos antecipadamente,

Jake (Noob)

Foi útil?

Solução

Eu diria que ele é lento porque o motor está fazendo varreduras em todo o lugar, em vez de procura. Você quis dizer para que SELECT a. * em vez disso? Isso seria mais rápido também, SELECT * aqui é equivalente a um. *, B *., C. *, D. *.

Você provavelmente irá obter melhores resultados se você colocar um índice separado em cada uma dessas colunas:

  • a.did (de modo que = a.did 'XXX' é um buscar em vez de uma varredura, também ajuda a.did = d.id)
  • a.cid (para a.cid = c.id)
  • b.aid (para a.id = b.aid)

Você poderia tentar adicionar Status para o primeiro e segundo índices com ordem crescente, para o desempenho adicional -. Não faz mal

Outras dicas

Eu seria curioso para saber como você trabalhou-se que o problema é 'a cláusula ORDER BY ea falta de qualquer índice na tabela 'a'.' Acho isso um pouco suspeito porque não há um índice na tabela A, na chave primária, mais tarde dizer.

Olhando para a natureza da consulta e que eu posso adivinhar sobre a natureza dos dados, eu acho que essa consulta, em geral, produzem relativamente poucos resultados em comparação com o tamanho das tabelas que ele está usando, e que, portanto, o ORDER BY seria extremamente barato. Claro, isso é apenas um palpite.

Se um índice vai mesmo ajudar em tudo depende dos dados na tabela. O que os índices seu otimizador de consulta usará ao fazer uma consulta é dependente de uma série de fatores diferentes, um dos grandes sendo o número esperado de resultados produzidos a partir de uma pesquisa.

Uma coisa que ajudaria muito é se você ia postar a saída de explicar sua consulta.

você já tentou se junta?

* seleccione a partir de uma junção interna b em a.id = b.aid junção interna c no a.cid = c.id junção interna de d em a.did = d.id onde a.did = 'XXX' ORDER BY a.status

o uso correto da junta (à esquerda, Richt, interior, exterior) depende da estrutura de tabelas

espero que isso ajude

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