2011-11-25 14 views
7

Hay dos características de la base de datos MySQL que quiero usar en mi aplicación. El primero es FULL-TEXT-SEARCH y TRANSACTIONS.Dilema del motor de almacenamiento MySQL

Ahora, el dilema aquí es que no puedo obtener esta característica en un motor de almacenamiento. O uso MyIsam (que tiene la función FULL-TEXT-SEARCH) o uso InnoDB (que admite la función TRANSACTION). No puedo tener ambos.

Mi pregunta es, ¿de todos modos puedo tener ambas características en mi aplicación antes de que me obliguen a elegir entre los dos motores de almacenamiento.

+1

Usted puede usar algo como [Sphinx] (http://sphinxsearch.com/) o [Solr] (http://lucene.apache.org/solr/) para indexar y buscar cualquier base de datos MySQL. Entonces podrías usar InnoDB. –

+0

Bien. Eso es lucene correcto. Supuse que esa sería mi única opción. Gracias por la pronta respuesta – burntblark

+0

solo use innodb. confíe en la caché que hace la mayor parte del trabajo, no necesitará una búsqueda de texto completo. –

Respuesta

10

soluciones posibles:

  1. Uso Sphinx o Solr o algún otro motor de búsqueda de texto externo para sus búsquedas de texto y utilizar el motor InnoDB.

  2. Escriba su propio código de búsqueda y use InnoDB. Esto no es realmente una opción, a menos que las necesidades de búsqueda sean limitadas o su presupuesto sea enorme.

  3. uso tanto en motores, MyISAM e InnoDB. Mantenga las columnas que desea que sean búsquedas de texto completo en MyISAM y el resto en InnoDB. Esto será arriesgado ya que los datos en MyISAM no serán seguros para las transacciones.

  4. uso tanto en motores, MyISAM e InnoDB. Guarde todos los datos en InnoDB y duplique las columnas que desea que sean búsquedas de texto completo en MyISAM. Esto necesitará algún mecanismo (disparadores) para la duplicación de datos.

  5. esperar a la versión de MySQL donde la búsqueda de texto completo será apoyado por InnoDB u otro motor transaccional.

  6. (opción 4) pero el uso de MariaDB (un tenedor MySQL) que tiene "crash-safe" (pero todavía no transaccionales) completos índices de texto: When-will-transactional-fulltext-indexes-be-ready?

  7. Use otros RDBMS como PostgreSQL que tiene plena -texto de apoyo en el motor transaccional.

+1

+1 Descripción agradable. Tuve éxito con la opción 4 en un caso en el que el requisito de texto completo se localiza en unas pocas columnas. – grossvogel

+0

+1, por cierto, ¿la opción 5 tiene una fecha proyectada o solo especula? – Drew

+1

@AndrewHeath: No, no tengo idea de la fecha prevista. Puede preguntar en el foro de MySQL (InnoDB) o en el foro de MariaDB. –

2

no hay forma de tener ambos en el mismo motor de base de datos, estas son las limitaciones dadas por el diseño de cómo funciona MySQL. No puedes cambiar la física. ;-)

http://dev.mysql.com/doc/refman/5.1/en/innodb-restrictions.html
http://dev.mysql.com/doc/refman/5.1/en/ansi-diff-transactions.html

cuando está todavía en fase de diseño, también puede considerar el uso de otro implmentation SQL para su proyecto que apoya tanto en el mismo motor. Postgres por ejemplo lo hace.

http://wiki.postgresql.org/wiki/Why_PostgreSQL_Instead_of_MySQL_2009#Transactions_and_the_Database_Engine_Core

+1

Gracias Kaii ... Postgre aquí vengo :). – burntblark

+1

No estoy seguro de qué tiene que ver esto con la física, pero aquí hay un neutrino más rápido que la luz para ti: http://blogs.innodb.com/wp/2011/07/innodb-fts-performance/ –

+0

@Michael: lo siento , olvidé el emoticón junto a "física". Lo arreglé Es bueno leer innodb pronto admite texto completo, pero todavía tenemos que esperar hasta que esté disponible en los paquetes de mysql de las principales distribuciones. – Kaii

5

Si necesita realizar transacciones y de texto completo en contra de una sola tabla en MySQL, usted tiene algunas opciones. Pero realmente el punto sobresaliente de esta discusión es que las bases de datos no son buenas para hacer búsquedas de texto completo (¡especialmente MySQL!) E idealmente desea descargar este trabajo a un componente que sea mejor para este tipo de búsqueda de la tarea.

Opción 1:

Crear una tabla que tiene que hacer frente a la transacción como InnoDB y luego crear otra tabla "espejo" que es MyISAM que se puede hacer búsqueda de texto completo en contra. Puede mantener los datos sincronizados mediante el uso de un disparador en la tabla InnoDB. Una especie de truco, pero funcionará.

Opción 3:

Tome un vistazo a un motor de texto completo 3er partido como Sphinx, Lucene o Solr. De esta forma, puede centrarse en diseñar su base de datos para que sea óptima al consultar datos y no forzarla a realizar búsquedas de texto también.

Opción 3:

Usted puede optar por ir con un servidor de base de datos diferente que soporta transacciones y búsqueda de texto completo, al mismo tiempo, como SQL Server.

Espero que esto te dé un poco de claridad.

¡Disfrútalo!

+1

usando un motor de búsqueda en lugar de índices de texto completo son totalmente diferentes enfoques: ambos tienen sus ventajas e inconvenientes. lea aquí para una buena comparación de texto completo de Lucene vs. MySQL ... puede encajar bien en otros motores de búsqueda frente a otros motores de base de datos: http://jayant7k.blogspot.com/2006/05/mysql-fulltext-search- versus-lucene.html – Kaii

3

El MyISAM índice de texto probablemente no es tan bueno como parece. Funciona bien (ish) en datos pequeños, pero es pésimo en datos más grandes.

En MySQL 5.6 que puede tener de texto en InnoDB, sin embargo, todavía no es compatible con la mayoría de las características que un verdadero motor de búsqueda de texto completo tendría.

1

Una otra opción es utilizar el apoyo de MySQL para la replicación:

Por ejemplo, puede servidor maestro de configuración con el motor de almacenamiento InnoDB. A continuación, repítalo a otro servidor de solo lectura con el motor de almacenamiento MyISAM.

se puede utilizar casi cualquier motor de almacenamiento de MySQL y que podría haber algunos que apoyan mejores características de búsqueda que MyISAM para algunos casos de uso.

Cuestiones relacionadas