Alguém pode explicar como o operador LIKE é implementado em sistemas de banco de dados atuais (por exemplo, MySQL ou Postgres)? ou me aponte para algumas referências que explicam isso?
A abordagem ingênua seria inspecionar cada registro, executando uma expressão regular ou correspondência parcial de string no campo de interesse, mas tenho a sensação (espero) de que esses sistemas façam algo mais inteligente.
Além do que Justin Cave escreveu, desde o PostgreSQL 9.1 você pode acelerar qualquer pesquisa com
LIKE
(~~
) ouILIKE
(~~*
) e correspondências básicas de expressões regulares também (~
). Use as classes de operador fornecidas pelo módulo pg_trgm com um índice GIN ou GiST para acelerar asLIKE
expressões que não são ancoradas à esquerda. Para instalar a extensão, execute uma vez por banco de dados:Crie um índice do formulário:
Ou:
Criar e manter um índice GIN ou GiST tem um custo, mas se sua tabela não for muito escrita, esse é um ótimo recurso para você.
Depesz tem um excelente artigo em seu blog sobre o recurso.
GIN ou GIST?
Estas duas citações do manual devem fornecer alguma orientação
(Como aqui .)
Mas para consultas do tipo "vizinho mais próximo" usando o operador de distância
<->
:Não, isso é basicamente 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 pode aplicar a expressão regular ao índice. Então, por exemplo, se você escrever
o banco de dados pode usar o índice
LAST_NAME
para localizar todas as linhas onde o sobrenome começa com 'Cav'. Por outro lado, se você tivesse algo comoo banco de dados teria que varrer 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 tem 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 .
Falando sobre o MySQL, a posição do caractere curinga (%) faz diferença. Se a primeira parte do texto for especificada como , o mecanismo de banco de dados pesquisará apenas um subconjunto menor de palavras começando com S, indo para St e depois Sta
where first_name like 'Sta%'
etc.where first_name like '%stan%'
coluna será necessária. Você também pode consultar índices de texto completo que também fazem pesquisas em linguagem natural. Confira os documentos do MySQL aqui.