Não, isso é o que eles estão fazendo. Agora, se não houver um curinga inicial e o campo estiver indexado, que é a situação usual, o mecanismo de banco de dados poderá aplicar a expressão regular ao índice. Então, por exemplo, se você escrever
SELECT *
FROM employees
WHERE last_name LIKE 'Cav%'
o banco de dados pode usar o índice LAST_NAME
para encontrar todas as linhas em que o sobrenome começa 'Cav'. Por outro lado, se você tivesse algo como
SELECT *
FROM employees
WHERE last_name LIKE '%av%'
o banco de dados precisaria verificar a tabela inteira (ou o índice inteiro) e avaliar a expressão em relação ao LAST_NAME
valor total . Obviamente, isso é muito caro.
A maioria dos melhores bancos de dados relacionais possui recursos para fazer pesquisa de texto completo de maneira mais eficiente, construindo diferentes tipos de índices e catálogos de texto, mas eles não usam a palavra-chave LIKE. Por exemplo, aqui está um bom artigo que discute a pesquisa de texto completo no PostgreSQL .
LAST_NAME
ser candidato ao (a primeira coluna do) índice indexado em cluster? pps até que ponto essa resposta assume que o sistema de banco de dados é baseado em armazenamento contínuo em índices de disco e árvore B?Além do que Justin Cave escreveu, desde o PostgreSQL 9.1, você pode acelerar qualquer pesquisa com
LIKE
(~~
) ouILIKE
(~~*
), além de correspondências básicas de expressões regulares (~
). Use as classes de operadores fornecidas pelo módulo pg_trgm com um índice GIN ou GiST para acelerarLIKE
expressões que não estão ancoradas à esquerda. Para instalar a extensão, execute uma vez por banco de dados:Crie um índice do formulário
Ou:
Criando e mantendo um índice GIN ou GiST acarreta um custo, mas se sua tabela não for muito escrita, esse é um ótimo recurso para você.
Depesz escreveu um excelente artigo em seu blog sobre o novo recurso.
GIN ou GiST?
Essas duas citações do manual devem fornecer algumas orientações
Mas para o tipo de consultas "vizinho mais próximo" com o operador using the distance
<->
:fonte
Falando sobre o MySQL, a posição do caractere curinga (%) faz a diferença. Se a primeira parte do texto for especificada como
where first_name like 'Sta%'
, o mecanismo de banco de dados pesquisará apenas um subconjunto menor de palavras com S, passando para St e Sta, etc. Se você fizer algo parecidowhere first_name like '%stan%'
, faça uma varredura completa do coluna será necessária. Você também pode procurar em índices de texto completo que também fazem pesquisas em idiomas naturais. Confira os documentos do MySQL aqui.fonte