Tenho as seguintes 2 dúvidas:
SELECT * FROM mytable
WHERE id=1;
e
SELECT * FROM mytable
WHERE id IN(1);
Supondo que mytable
seja muito grande, estou interessado na diferença de desempenho para os 2 em tabelas muito grandes. Sei que IN() deve ser geralmente mais lento nos casos em que forneço uma lista de valores para ele, mas como IN(1) é equivalente ao caso =1 quando um item existe, o planejador/otimizador de consultas reconhece esse caso e lida com a sobrecarga de desempenho que geralmente existe? Existe alguma maneira de verificar isso além de cronometrar os resultados da consulta?
Sim,
MySQL
converteem
Então,
id IN (1)
é igual aid = 1
Sim, veja o plano de execução, use
ou
Se ambos produzem o mesmo plano de execução, isso confirma que o MySQL os está tratando de forma idêntica.
Fiz um teste em um dos meus bancos de dados de produção.
Versão:
8.0.41-0ubuntu0.22.04.1
Executei as seguintes consultas e elas produziram o mesmo plano de execução idêntico
Agora, se eu adicionar outro valor na
in
cláusula o plano de execução mudaTalvez as questões mais críticas sejam:
id=1
eid IN (1)
otimize igualmente bem? Simid = 1 OR id = 2
eid IN (1,2)
otimizar igualmente bem? Sim .id IN (1)
eid IN (1,2)
otimize igualmente bem? NÃOLevando a questão adiante:
id BETWEEN 123 AND 456
é idêntico aid >= 123 AND id <= 456
Ambos são testes de "alcance".foo LIKE 'prefix%'
é um teste de alcance, masfoo LIKE '%suffix'
precisa de uma 'varredura de tabela'.id IS NULL
funciona como=
, MasIS NOT NULL
não; ele precisa de uma varredura de tabela.A ordem de otimizabilidade:
=
eIS NULL
eIN (<one item>)
IN(<more than one item>)
Mais: Índice Livro de receitas
(Essas dicas se aplicam ao MySQL 8 e à maioria das versões mais antigas, além do MariaDB.)
Não vejo nenhum índice "composto" no seu esquema. Vamos ver se você precisa de um; mostre-nos um 'real'
SELECT
.