Pergunta

Eu não estou recebendo quaisquer erros, como tal, apenas um problema de desempenho menor.

EXPLAIN
SELECT
a.nid,
a.title,
a.uid,
b.parent,
b.weight,
c.name,
d.value
FROM table1 AS a INNER JOIN table2 AS b ON a.vid = b.vid AND a.status = 1
INNER JOIN table3 AS c ON c.uid = a.uid
INNER JOIN table4 AS d ON d.content_id = a.nid AND d.value_type = 'percent' AND d.function = 'average'

Quando eu olho para as tabelas que estão sendo referenciado, está tudo bem, mas a partir de Tabela 4, onde ele só deve ser selecionando o campo "valor", estou ficando um tudo que está sendo chamado ...

id  select_type     table   type      possible_keys                                   key     key_len   ref                   rows  Extra
1   SIMPLE          a     ref     PRIMARY,vid,status,uid,node_status_type,nid   status  4         const                 1    
1   SIMPLE          b     eq_ref    PRIMARY                                         PRIMARY 4         databasename.a.vid    1    
1   SIMPLE          c     eq_ref    PRIMARY                                         PRIMARY 4         databasename.a.uid    1   Using where
1   SIMPLE          d     ALL     NULL                                          NULL      NULL      NULL                  2     Using where

Como você pode ver, está selecionando * da mesa final (d). Por que ele está fazendo isso quando eu só precisa de um campo selecionado a partir dele? Alguém pode me ajudar?

Foi útil?

Solução

ALL significa todas as linhas, nem todas as colunas. Desde que diz que não há chaves possíveis, eu acho que você não tem um índice em d.content_id ou d.value_type ou d.function.

Se você queria ser extravagante, você poderia colocar um índice em todos os 3 dessas colunas.

Outras dicas

Você d.value_type e d.function campos indexados? Isso seria instinto inicial quanto à causa.

Adicionar um índice de múltiplas colunas para table4 com base nas colunas content_type, value_type e function.

A sua consulta não está selecionando todas as colunas da table4, está selecionando todas as linhas; este não é um grande problema quando há apenas dois.

Note que um plano de execução da consulta MySQL pode não dar a dar a resposta que você espera quando você está trabalhando com um pequeno número de registros; ele pode ser mais rápido para o banco de dados para fazer uma varredura completa da tabela nessas circunstâncias.

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