Achei a seguinte palestra de Zardosht Kasheff esclarecedora:
http://www.infoq.com/presentations/Index-SQL
mas cobre apenas o caso de consultas simples em uma única tabela.
Existe algo semelhante para consultas envolvendo várias tabelas? Possivelmente incluindo GROUP BY?
Estou procurando algumas teorias/diretrizes que posso aplicar ao MySQL com o mecanismo de armazenamento InnoDB.
Um erro comum é
Quando você tem
JOIN
duas tabelas, geralmente obtém uma explosão do número de linhas. OSUM
é então feito, provavelmente resumindo a.foo repetidamente, levando à resposta 'errada' (grande demais).Mas não foi isso que você perguntou.
A
JOIN
é quase sempre executado desta forma :WHERE
). Até agora, aplicam-se as regras de tabela única.Portanto, a nova pergunta que você está fazendo é como acessar a tabela 2 ? Existe uma
ON
cláusula (supondo que não seja uma "junção cruzada"). Isso fornece um (ou mais) campo que deve ser usado no 'melhor' índice da tabela 2. Em seguida, use esse campo, mais quaisquer outros campos emWHERE
, juntamente com as regras de tabela única para construir o índice ideal para esseJOIN
.Uma vez que o otimizador pode escolher uma ordem diferente de tabelas ou pode ter várias opções, encontre os melhores índices para cada ordem.
Então simplifique .
INDEX(x), INDEX(x,y)
-->INDEX(x,y)
PRIMARY KEY
tabela 2, não precisará de um índice mais longo.EXPLAIN
dirá "Usando índice", não deve ser confundido com "Usando condição de índice", que é ICP.)Seguem algumas dicas de como o otimizador pensa ao unir duas tabelas:
WHERE
filtro será escolhida antes de uma sem.ORDER BY
será preferido a aWHERE
na ordenação das tabelas.LIMIT
raramente é um fator, embora provavelmente devesse ser.Meu livro de receitas também se concentra em mesa única; talvez esta resposta me ajude a escrever sobre
JOINs
.