Pergunta

Alguém sabe o que a complexidade é para o operador SQL LIKE para os bancos de dados mais populares?

Foi útil?

Solução

Vamos considerar os três casos principais separadamente. Esta discussão é específico do MySQL, mas pode também se aplicam a outros DBMS devido ao fato de que os índices são geralmente implementadas de forma similar.

LIKE 'foo%' é rápida se correr sobre uma coluna indexada. índices MySQL são uma variação de B-árvores, assim quando se realiza esta consulta pode simplesmente descer a árvore para o nó correspondente ao foo, ou o primeiro nó com esse prefixo, e percorrer a árvore em frente. Tudo isso é muito eficiente.

LIKE '%foo' não pode ser acelerada por índices e irá resultar em uma varredura completa da tabela. Se você tem outros critérios que lata por índices usando executado, ele só vai digitalizar as linhas que permanecem após a filtragem inicial.

Há um truque embora : Se você precisa fazer correspondência de sufixo - à procura de nomes de arquivos com extensão .foo, por exemplo - você pode conseguir o mesmo desempenho adicionando uma coluna com o mesmo conteúdo que o um original, mas com os personagens na ordem inversa.

ALTER TABLE my_table ADD COLUMN col_reverse VARCHAR (256) NOT NULL;
ALTER TABLE my_table ADD INDEX idx_col_reverse (col_reverse);
UPDATE my_table SET col_reverse = REVERSE(col);

Procurar linhas com col que terminam em .foo torna-se então:

SELECT * FROM my_table WHERE col_reverse LIKE 'oof.%'

Finalmente, há LIKE '%foo%', para o qual não existem atalhos. Se não há outros critérios que limitam o que reduz a quantidade de linhas a um número viável, vai causar um impacto no desempenho duro. Você pode querer considerar uma solução de pesquisa de texto completo em vez disso, ou alguma outra solução especializada.

Outras dicas

Se você está perguntando sobre o impacto no desempenho:

O problema de como é que ele mantém o banco de dados usando um índice. No Oracle Eu acho que ele não usa índices mais (mas ainda estou no Oracle 9). SqlServer utiliza índices se o carácter universal é apenas no final. Eu não sei sobre outras bases de dados.

depende do RDBMS, os dados (e possivelmente o tamanho dos dados), índices e como o LIKE é usado (com ou sem prefixo curinga)!

Você está pedindo uma pergunta de um demasiado geral.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top