Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Otimização do MySQL para REGEXP


Se você deve usar o estilo regexp WHERE cláusulas, você definitivamente será atormentado por problemas de consulta lenta. Para que a pesquisa no estilo regexp funcione, o MySQL deve comparar todos os valores em sua coluna de nome com o regexp. E sua consulta dobrou o problema ao olhar também para sua coluna de nome de usuário.

Isso significa que o MySQL não pode tirar proveito de nenhum índice, que é como todos os DBMSs aceleram as consultas de tabelas grandes.

Existem algumas coisas que você pode tentar. Todos eles envolvem dizer adeus ao REGEXP.

Um é este:
WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')

Se você criar índices em suas colunas de nome e nome de usuário, isso deve ser decentemente rápido. Ele procurará todos os nomes/nomes de usuário começando com 'jack'. Notar que
WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */

procurará por nomes que terminam com 'jack', mas será lento como sua pesquisa no estilo regexp.

Outra coisa que você pode fazer é descobrir por que seu aplicativo precisa pesquisar parte de um nome ou nome de usuário. Você pode eliminar esse recurso do seu aplicativo ou descobrir uma maneira melhor de lidar com isso.

Possíveis maneiras melhores:
  1. Peça aos usuários que dividam seus nomes em campos de nome e sobrenome e pesquisem separadamente.
  2. Crie um recurso "pesquisar todos os usuários" separado que só seja usado quando um usuário precisar dele, reduzindo assim a frequência de sua consulta lenta no estilo regexp.
  3. Divida seus nomes em uma tabela de palavras-nomes separada usando algum tipo de programa de pré-processamento. Pesquise a tabela de palavras de nome sem regexp.
  4. Descubra como usar a pesquisa de texto completo do MySQL para esse recurso.

Tudo isso envolve algum trabalho de programação.