Eu configurei minha tabela com um índice apenas em done_status (done_status = INT):
Quando eu uso:
EXPLAIN SELECT * FROM reminder WHERE done_status=2
Eu recebo de volta:
id select_type tipo de tabela possible_keys key key_len ref linhas Extra 1 lembrete SIMPLES TUDO done_status NULL NULL NULL 5 Usando where
Mas quando eu emito este comando:
EXPLAIN SELECT * FROM reminder WHERE done_status=1
Eu recebo o seguinte retornado:
id select_type tipo de tabela possible_keys key key_len ref linhas Extra 1 lembrete SIM ref referência done_status done_status 4 const 2
O EXPLAIN
me mostra que ele usa 5 linhas, a segunda vez 2 linhas.
Eu não acho que o índice é usado, se eu entendi direito na primeira vez, ele deve me dar três linhas. O que eu faço de errado?
SHOW INDEX FROM reminder
:
Tabela Nome-chave não exclusivo Seq_in_index Nome_da_coluna Cardinalidade do agrupamento Sub_parta Nulo compactado Índice_tipo Comentário Index_comment lembrete 1 done_status 1 done_status A 5 NULL NULL BTREE
explicar estendido:
id select_type tipo de tabela possible_keys key key_len ref linhas filtradas Extra 1 lembrete SIM ref referência done_status done_status 4 const 2 100,00
show warnings
não mostrou nada de interesse.
Respostas:
Você entende mal o que é o campo 'linhas'. É o número de linhas que o mysql calcula que ele precisará ler para satisfazer sua consulta. Este valor pode ser bastante impreciso. Isso não significa que este é o número de linhas no resultado - ou o número real de linhas lidas pelo mysql
fonte
O primeiro plano de execução não utiliza o índice com certeza,
pode ser que o information_schema.statistics no índice não alcance os dados após algumas operações de gravação ou a tabela não seja acessada por um longo período de tempo.
como explicado aqui: - De onde o MySQL Query Optimizer lê as estatísticas do índice?
para o segundo plano de execução, parece que o information_schema.statistics já atualiza e corrige o problema de cardinalidade NULL.
Portanto, é executar a consulta de acordo com o otimizador de índice.
Para tabela com pequenas linhas, isso não importa muito.
Mas os dados crescerão, o desenvolvedor deve sempre verificar isso
e executar a tabela de análise necessária quando a cardinalidade do encontro for nula no índice.
fonte
O primeiro plano de execução não está usando um índice.
Do site de referência do MySQL :
Se sua tabela possui apenas 5 linhas e sua consulta seleciona 3 delas, o otimizador do MySQL assume que é mais eficiente verificar a tabela inteira.
fonte