Si debe usar el estilo de expresión regular WHERE
cláusulas, definitivamente estará plagado de problemas de consulta lenta. Para que funcione la búsqueda de estilo regexp, MySQL tiene que comparar cada valor en su columna de nombre con la expresión regular. Y su consulta ha duplicado el problema al mirar también la columna de su nombre de usuario.
Esto significa que MySQL no puede aprovechar ningún índice, que es la forma en que todos los DBMS aceleran las consultas de tablas grandes.
Hay algunas cosas que puedes intentar. Todos ellos implican decir adiós a REGEXP.
Uno es este:
WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')
Si crea índices en las columnas de su nombre y nombre de usuario, esto debería ser bastante rápido. Buscará todos los nombres/nombres de usuario que comiencen con 'jack'. TENGA EN CUENTA que
WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */
buscará nombres que terminen con 'jack' pero será lento como su búsqueda de estilo regexp.
Otra cosa que puede hacer es averiguar por qué su aplicación necesita poder buscar parte de un nombre o nombre de usuario. Puede eliminar esta característica de su aplicación o encontrar una mejor manera de manejarla.
Posibles mejores formas:
- Pida a sus usuarios que dividan sus nombres en campos de nombre de pila y apellido, y que busquen por separado.
- Cree una función separada de "buscar en todos los usuarios" que solo se use cuando un usuario la necesite, reduciendo así la frecuencia de su consulta lenta de estilo regexp.
- Divida sus nombres en una tabla separada de nombres y palabras utilizando algún tipo de programa de preprocesamiento. Buscar en la tabla de nombres y palabras sin expresiones regulares.
- Averigüe cómo usar la búsqueda de texto completo de MySQL para esta característica.
Todos estos implican algo de trabajo de programación.