Tenho uma tabela com aproximadamente 80 colunas. Várias delas são indexadas. Elas incluem age
, shoesize
e height
- todas são inteiros.
Tenho então uma consulta que estou tentando otimizar:
select * from people where age > 18 and shoesize > 10 and height > 150
Para tentar acelerar a consulta, criei um novo índice combinado das três colunas em questão - age
, shoesize
e height
. Chamei esse índicecombinedIndex
Se eu então executar:
explain select * from people where age > 18 and shoesize > 10 and height > 150
Então vejo esta saída:
id = 1
select_type = SIMPLE
table = people
type = ALL
possible_keys = age, shoesize, height, combinedIndex
key = NULL
key_len = NULL
ref = NULL
rows = 8947017
extra = using where
Então parece que nenhum índice está sendo usado ao executar minha consulta.
Eu esperava que meu combinedIndex
fosse usado com certeza.
Estou usando o MariaDB 10.6.19
Onde foi que eu errei?
Nenhum dos seus índices de coluna única é seletivo o suficiente para valer a pena usar. Usar um índice não seletivo significa ir e voltar entre o BTree do índice e o BTree de dados.
O índice composto não é muito melhor; ele ainda tem que trabalhar duro para fazer a filtragem. Além disso, o índice de coluna única com a mesma coluna que a primeira coluna no composto está confundindo o Optimizer. Remova esse índice de coluna única; veja se ajuda.
Você também pode tentar isto:
Suspeito que essa consulta em particular seja apenas a ponta do iceberg. Como há um pequeno limite para quantos índices uma tabela pode ter, recomendo o seguinte: Estude consultas reais que as pessoas usam e, em seguida, crie vários índices de 2 colunas. Tente ter a primeira coluna algo que é frequentemente testado com
=
. Tente também evitar que a(s) primeira(s) coluna(s) de dois índices sejam a(s) mesma(s) coluna(s) na mesma ordem.