Preciso otimizar o desempenho em uma pesquisa com muitas strings como Z1719121
.
minha estrutura de tabela:
codfabrica => varchar 191 => nullable
codoriginal => varchar 191 => nullable
aplicacao => mediumText => nullable
índices de tabela:
codfabrica => non_unique 1 | seq_in_index 1 | collation A | cardinality 42466
codoriginal => non_unique 1 | seq_in_index 1 | collation A | cardinality 7449
aplicacao => non_unique 1 | seq_in_index 1 | collation NULL | cardinality 42550
código de consulta laravel:
$allKeys = [...]; // array with lots of strings
$q = MyModel::query();
$q->whereIn('codfabrica', $allKeys);
$q->orWhereIn('codoriginal', $allKeys);
$q->orWhereRaw('MATCH (aplicacao) AGAINST (?)', array($allKeys));
resultados:
array with 1000 strings => took 5 seconds
array with 2500 strings => took 35 seconds
Existe alguma maneira de otimizar essa pesquisa?
Não tenho experiência com INDEX, então criei índices da maneira correta?
Esta tabela atualmente possui 42.000 rows
e 20mb total size
, hospedado no AWS db.t3.small
servidor RDS (2 vCPUs, 2 GiB de memória).
Solução possível:
e
O motivo dos problemas de desempenho:
OR
impede o uso de quaisquer índices.Se desejar discutir mais, forneça alguns dados de amostra para cada uma das colunas. (
FULLTEXT
tem algumas limitações que você pode encontrar.)