Estoy diseñando una web interno de la aplicación que utiliza MySQL como backend de base de datos. La integridad de los datos es crucial, así que estoy usando el innoDB motor para su restricción foreign key características.

Quiero hacer una búsqueda de texto completo de uno de los tipos de registros, y que no es compatible de forma nativa con tablas innoDB. No estoy dispuesto a pasar a la MyISAM tablas debido a su falta de clave externa de apoyo y debido al hecho de que su cierre es por la tabla, no por fila.

Sería mala práctica para crear un espejo de la tabla de los registros necesito una búsqueda utilizando el motor MyISAM y el uso que de la búsqueda de texto completo? De esta manera estoy buscando una copia de los datos y si pasa algo para que los datos no es tan grande de un acuerdo, debido a que siempre puede ser re-creado.

O se trata de una torpe manera de hacerlo que deben evitarse?

Gracias.

Hay una muy buena lista de opciones de Percona: mysqlperformanceblog.com/2009/09/10/…

OriginalEl autor Rob | 2010-04-14

5 Comentarios

  1. 10

    Usted podría ser capaz de hacer algún tipo de sincronización de datos mediante desencadenadores (si tu versión de mysql soporta ellos). Que permite llevar a cabo pequeños fragmentos de SQL en ciertos puntos, como después se insertan datos en o eliminado de una tabla.

    Por ejemplo…

    create trigger TRIGGER_NAME after insert on INNODB_TABLE
    insert into MYISAM_TABLE select * from INNODB_TABLE
    where id = last_insert_id();

    … Cuando se insertan datos en la tabla INNODB, los mismos datos se inserta automáticamente en la tabla MYISAM.

    esta solución, trabajar con jdbc y mysql 5.1?
    sí desencadenantes son compatibles en 5.1
    JDBC no tienen ninguna relación con los factores desencadenantes que son de la base de datos secundarios como yo sé. A michael su solución es bastante sucio como primera vista, pero bastante eficiente (no se vuelva a introducir todos los datos después de cada inserción ?)
    no, el last_insert_id() asegura que se agarra a sólo una fila.

    OriginalEl autor michael

  2. 7

    Creo que es realmente incómodo. Dicho esto, mi «prototipo rápido que probablemente accidentalmente el código de producción» método de hacer esto es algo como esto:

    CREATE TEMPORARY TABLE search_mirror (FULLTEXT INDEX (col1, col2, ...)) Engine=MyISAM SELECT * FROM original_innodb_table;
    
    SELECT * FROM search_mirror WHERE MATCH(col1, col2, ...) AGAINST ('foo');
    
    DROP TEMPORARY TABLE search_mirror;

    Y para puntos de bonificación que usted podría hacer todo eso dentro de una transacción que debe satisfacer su fantasía (doble bonus si usted está usando las conexiones no persistentes y sólo la búsqueda de una vez por conectar, como usted puede, a continuación, eliminar la instrucción drop).

    Sí me doy cuenta de que esto no es cierto, el reflejo o la replicación. Sí me doy cuenta de engañar a la mesa puede ser caro (relativamente pequeños conjuntos de datos aquí). Como he dicho, rápido y sucio prototipo. YMMV

    De acuerdo. Es realmente incómodo.
    Única cosa mejor que el código de las advertencias. 😛
    ¿Cómo recrear todo el índice en cada consulta sea mejor que una búsqueda con LIKE?

    OriginalEl autor pcarter

  3. 2

    Puede crear una mesa de espejo. Eso es probablemente menos que ideal, como la tabla MyISAM no respeto de sus transacciones (si hay un error en la transacción en InnoDB, los cambios realizados a MyISAM en que la transacción aparecerá).

    Usted podría utilizar una dedicada de búsqueda de texto completo sistema como Esfinge, que es lo que he utilizado para la búsqueda de texto completo (Desde mi base de datos InnoDB).

    OriginalEl autor Mitch Dempsey

  4. 1

    Creo que la solución más simple para este problema es la creación de un índice de la tabla que será utilizado para las búsquedas, con un puntero a la tabla que contiene los datos reales. Me estoy enfrentando exactamente el mismo problema y no quiero usar tablas MyISAM para mi sistema, porque de la paz de la mente dada por tablas InnoDB.

    Lo que estoy planeando hacer con mi problema es crear una tabla de índice de usar MyISAM, así que sólo puede tener la información para ser indexado. La sincronización se realiza mediante desencadenadores, que es la forma más simple de hacerlo. No quiero replicar toda la tabla, ya que va a costar un montón de espacio. Sin embargo, replicando sólo los campos que desee tendrá un costo de espacio en detrimento de la búsqueda de la fábrica de motores.

    Este índice puede ser entendido como un índice para la búsqueda de instalaciones. Como cualquier otro índice, que tendrá un costo de espacio. Como optimización, la inserción de los datos en esta tabla de índice puede ser sólo términos, pero de esta manera el procesamiento adicional es necesario para limpiar palabra inútil para la búsqueda.

    OriginalEl autor Ronaldo Faria Lima

  5. 1

    ¡Buenas noticias! En MySQL 5.6 y de seguridad, los índices de texto completo puede ser utilizado con tablas InnoDB. Considere la posibilidad de actualizar su MySQL 5.6 o si no ha todavía.

    Con mi solicitud de búsqueda de texto completo fue muy importante por lo que me acaba de usar MyISAM. Ahora, he actualizado MySQL 5.6, convertir la base de datos InnoDB y se añade la correcta restricciones. Lo mejor de molestar mundos.

    MySQL 5.6 Manual Completo De Funciones De Búsqueda De Texto

    OriginalEl autor Syclone

Dejar respuesta

Please enter your comment!
Please enter your name here