2009-07-04 22 views
11

Estoy bastante confundido por el daño-mongering here.¿Cuándo debe elegir utilizar InnoDB en MySQL?

Sé cómo hacerlas, mire a continuación, ¿pero no tengo idea de por qué? ¿Para qué son?

create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)) type=InnoDB; 


create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)); 
+1

Su ejemplo está haciendo llaves foráneas, no innodb. Deberías haber preguntado para qué son las claves foráneas. –

+1

¿Qué "hacer daño"? Ese artículo trata sobre cómo recuperarse de una BASE DE DATOS DROP inadvertida. –

+0

Jim Ferrans: Me referí a la frase: "si no eres un programador con mucha experiencia, te dolerá". –

Respuesta

16

InnoDB es un storage engine in MySQL. Hay bastantes de ellos, y todos tienen sus pros y sus contras. Las mayores fortalezas de InnoDB son:

  • Soporte para transacciones (que le brinda soporte para la propiedad ACID).
  • Nivel de fila de bloqueo. Tener un mecanismo de bloqueo de grano más fino le da una mayor concurrencia en comparación, por ejemplo, con MyISAM.
  • Restricciones de clave externa. Permitiéndole dejar que la base de datos garantice la integridad del estado de la base de datos y las relaciones entre las tablas.
2

Everywhere! Despreciar myisam, innodb es el camino a seguir. No se trata solo de rendimiento, sino de integridad de datos y transacciones ácidas.

+0

Las transacciones ACID no siempre son necesarias, por lo que en muchos casos MyISAM es muy bueno. Hay diferentes soluciones para diferentes problemas. – Nin

2

En su ejemplo, crea claves externas. Las claves externas solo son compatibles con las tablas InnoDB, no con las tablas MyISAM.

2

Puede estar interesado en this article desde Database Journal que trata el tipo de tabla InnoDB en MySQL.

Extracto:

El mes pasado nos fijamos en el tipo de tabla de montón , un tipo de tabla, que se ejecuta por completo en la memoria. Este mes nos fijamos en configurando el tipo de tabla InnoDB, el tipo de mayor interés para los usuarios serios de . La tabla estándar MyISAM tipo es ideal para el uso del sitio web, donde son muchas lecturas en comparación con las escrituras , y no hay transacciones. Donde estas condiciones no se aplican (y además de sitios web, no se aplican a menudo en el mundo de la base de datos), la tabla InnoDB es probable que sea la tabla tipo de elección. Este artículo está dirigido al en usuarios que están familiarizados con MySQL, , pero solo han utilizado el tipo de tabla predeterminado MyISAM .

No me dejaría desanimar por la otra pregunta. Mantenga las copias de seguridad adecuadas de su base de datos, de cualquier tipo, y no deje caer las tablas por accidente ;-), y estará bien independientemente del tipo de tabla que elija.

+0

+1 para el artículo y copias de seguridad –

1

En general, para mí, el punto más importante es que InnoDB ofrece bloqueo por fila, mientras que MyISAM no se ve por tabla. En las mesas grandes con muchas escrituras, esto podría generar un gran problema de rendimiento.

En el otro lado, la tabla MyISAM tiene una estructura de archivos más fácil, copiar y reparar la tabla a nivel de archivo es mucho más fácil.

+0

+1 para perspectiva personal –

+0

¿Cuánto se considera mucho? una escritura por segundo es mucho? –

+0

@EvanLee Depende :) Especialmente la cantidad de datos que escribe, respectivamente, cuánto tarda la operación de escritura. Pero en general: ¡No! – leo

12

Siempre. A menos que necesite usar la búsqueda de texto completo de MySQL o InnoDB está deshabilitado en su servidor web compartido.

+0

esa es la respuesta más simple y ¡es verdad! – JohnB

+1

FYI InnoDB ahora es compatible con la búsqueda de texto completo. Además, InnoDB es mucho más rápido de lo que solía ser. Por lo tanto, raramente hay alguna razón para usar MyISAM nunca más * (razón por la cual InnoDB ahora es el motor predeterminado en MySQL) * –

0

Un suplemento a Machine y respuesta knoopx 's acerca de las transacciones:

El valor por defecto de MySQL tipo de tabla, MyISAM, no es compatible con transacciones. BerkeleyDB y InnoDB son los tipos de tabla transaccionales disponibles en código abierto MySQL, versión 3.23.34 y posteriores.

La definición de la transacción y un ejemplo de banca

Una transacción es una secuencia de operaciones de bases de datos individuales que están agrupados juntos. - Un buen ejemplo donde las transacciones son útiles es en la banca.

Source of the citations

1

Un comentario tiene un comando para convertir sus bases de datos a InnoDB here.

3

Creo que está confundido acerca de dos cuestiones diferentes, cuándo utilizar InnoDB en lugar de MyISAM, y cuándo usar extranjera restricciones clave (FK).

En cuanto al primer problema, ha habido muchas respuestas que explican las diferencias entre MyISAM e InnoDB. Solo voy a reiterar que, en la cita de tvanfosson de un artículo, MyISAM es más adecuado para sistemas con lecturas en su mayoría. Esto se debe a que utiliza bloqueo de nivel de tabla en lugar de nivel de fila como InnoDB, por lo que MyISAM no puede manejar la alta concurrencia además de características faltantes que ayudan con la integridad de datos como transacciones y claves externas (nuevamente, ya mencionado por otros).

No tiene que usar restricciones FK en su modelo de datos. Si sabes cuáles son las relaciones entre tus mesas y tu aplicación está libre de errores, podrás arreglárrtelas sin FKs. Sin embargo, usar FK brinda un seguro adicional en la capa de la base de datos porque entonces MySQL no permitirá que su aplicación inserte datos incorrectos en función de las restricciones que usted haya creado.

En caso de que no está claro en qué utilizar claves primarias (PK), haciendo una columna tal como id_order por ejemplo, la FC de la tabla orders significa que MySQL no se le permitirá INSERT el mismo valor de id_order más de una vez porque cada fila en una columna PK debe ser única.

Un FK se usaría en una tabla que tiene una dependencia en otra tabla, por ejemplo, order_items tendría una dependencia en orders (abajo). id_order_items es el PK de order_items y puede hacer id_order_items el FK de la tabla orders para establecer una relación uno a muchos entre orders y order_items. Del mismo modo, id_item podría ser un FK en la tabla order_items y un PK en la tabla items para establecer una relación de uno a varios entre order_items y items.

** Entonces, lo que la restricción FK hace es a evitar que la adición de un id_item value to the order_items table that isn't in the artículos table, or from adding a id_order_items to órdenes that isn't in the order_items `mesa. Todo lo que FK hace es asegurar la integridad de los datos, y también ayuda a transmitir las relaciones entre los desarrolladores **

Crédito adicional: entonces ¿por qué usar transacciones? Bueno, ya mencionó una cita que dice que son útiles para el sistema bancario, pero que son útiles en más situaciones que eso.

Básicamente, en una base de datos relacional, especialmente si es normalized, una operación de rutina como agregar un pedido, actualizar un pedido o eliminar un pedido a menudo toca más de 1 tabla y/o implica más de una declaración SQL. Incluso podría terminar tocando la misma mesa varias veces (como lo hace el ejemplo siguiente). Por cierto, las declaraciones de lenguaje de manipulación de datos (DML) (INSERT/UPDATE/DELETE) solo implican una tabla a la vez.

Un ejemplo de la adición de una orden:

recomiendo una mesa orders y una mesa de order_items. Esto lo hace para que pueda tener un PK en el id_order en la tabla orders, lo que significa que id_order no se puede repetir en orders. Sin la relación 1 a muchos orders - order_items, tendría que tener varias filas en la tabla orders para cada orden que tuviera varios elementos asociados (también necesita una tabla items para este sistema de comercio electrónico). Este ejemplo agregará un orden y tocará 2 tablas al hacerlo con 4 declaraciones diferentes INSERT.

(no hay restricciones de claves con fines ilustrativos)

-- insert #1 
INSERT INTO orders (id_order, id_order_items, id_customer) 
VALUES (100, 150, 1) 

-- insert #2 
INSERT INTO order_items (id_order_items, id_item) 
VALUES (4, 1) 

-- insert #3 
INSERT INTO order_items (id_order_items, id_item) 
VALUES (4, 2) 

-- insert #4 
INSERT INTO order_items (id_order_items, id_item) 
VALUES (4, 3)

Entonces, ¿qué si el inserto # 1 y inserto # 2 consultas se ejecutan correctamente, pero el inserto # 3 declaración no lo hicieron ? Usted terminaría con un pedido que le faltaba un artículo, y eso sería basura. Si en ese caso, desea deshacer todas las consultas para que la base de datos se encuentre en el mismo estado que estaba antes de , agregue el pedido y vuelva a empezar, bueno, eso es exactamente para lo que son las transacciones. ** Agrupa las consultas que desea que todas hagan, o en el caso de una excepción, ninguna en una transacción.

Así como las restricciones PK/FK, transacciones ayudar a asegurar la integridad de datos **

+0

Añadiendo 1 por oponer a innoDB a myIsam, cuando simplemente no conocemos mySQL e innoDB, no podemos saber que hay muchos motores. – pdem

2

InnoDB:.

El motor de almacenamiento InnoDB en MySQL. InnoDB es un motor de almacenamiento de alta confiabilidad y alto rendimiento para MySQL.Las principales ventajas de InnoDB incluyen:

  • Su diseño sigue el modelo ACID, con transacciones que incluyen funciones de compromiso, retrotracción y recuperación de fallas para proteger los datos del usuario.
  • El bloqueo de nivel de fila (sin escalar a bloqueos de granularidad más gruesos) y las lecturas consistentes de estilo Oracle aumentan la concurrencia y el rendimiento de múltiples usuarios.
  • Las tablas InnoDB organizan sus datos en el disco para optimizar las consultas comunes basadas en claves primarias. Cada tabla InnoDB tiene un índice de clave principal llamado índice agrupado que organiza los datos para minimizar la E/S para búsquedas de claves primarias.
  • Para mantener la integridad de los datos, InnoDB también admite restricciones de integridad referencial FOREIGN KEY.
  • Puede mezclar libremente tablas InnoDB con tablas de otros motores de almacenamiento MySQL, incluso dentro de la misma instrucción. Por ejemplo, puede usar una operación de combinación para combinar datos de las tablas InnoDB y MEMORY en una sola consulta.

InnoDB Limitaciones:

  • Sin indexación de texto completo (Abajo-5.6 versión de MySQL)

  • no se puede comprimir para una rápida, de sólo lectura

Más detalles:

Consulte esto link