sql >> Base de Datos >  >> RDS >> Mysql

Regexp y mysql:¿hay un operador AND?

Si necesita funciones de búsqueda sofisticadas, utilice una solución de búsqueda de texto completo.

En MySQL, el índice de búsqueda de texto completo incorporado La función solo funciona en el motor de almacenamiento MyISAM. Esto es desafortunado, porque InnoDB es el motor de almacenamiento preferible para todas las tablas de MySQL. InnoDB en las versiones recientes de MySQL es más rápido que MyISAM en la mayoría de los casos y tiene mejores funciones de recuperación de fallas que MyISAM.

Ha habido declaraciones del equipo de desarrollo de MySQL de que tienen la intención de implementar un índice de texto completo para InnoDB. Pero estamos a muchos meses o incluso años de que esto esté disponible, y ciertamente requerirá una actualización a alguna versión posterior de MySQL.

Si debe usar los índices de texto completo de MyISAM, le sugiero que almacene sus datos principalmente en InnoDB y luego almacene una copia del texto que se puede buscar en una tabla de MyISAM.

También puede usar una solución externa como Sphinx Search o Apache Solr para proporcionar capacidades de búsqueda de texto completo externamente a la base de datos. Incluso hay una manera de usar un índice de búsqueda de Sphinx a través de la interfaz del motor de almacenamiento conectable de MySQL .

No me gusta usar LIKE con comodines o REGEXP para búsquedas de texto completo. Estas soluciones incurren en exploraciones de tablas completas para cada búsqueda y, según el volumen de sus datos, se ejecutan cientos o miles de veces más lentamente que si tuviera un índice.

Escribí una comparación de soluciones de búsqueda de texto completo para MySQL en mi presentación, "Búsqueda práctica de texto completo en MySQL ," y también en un capítulo de mi libro Antipatrones SQL:Cómo evitar las trampas de la programación de bases de datos .

actualización:MySQL 5.6 está actualmente en desarrollo (desde febrero de 2012) e implementa una solución de índice de texto completo para InnoDB.