Ver Mensaje Individual
  #3 (permalink)  
Antiguo 04/04/2010, 01:42
abcdefghi
 
Fecha de Ingreso: enero-2010
Mensajes: 191
Antigüedad: 14 años, 11 meses
Puntos: 7
Respuesta: MyISAM e InnoDB, ¿cual elegir?

Cita:
Iniciado por VicHaunter Ver Mensaje
Buenas,

Seguramente no seré el primero que pregunta algo así, pero no es que no haya buscado ni mucho menos, de echo he leído varias docenas de artículos, posts, etc y no me ha quedado claro cual podría ser mejor.

El caso es que quiero elegir la mejor base según unos criterios que son en los que se va a basar mi base de datos:
La tabla tiene ahora unos 2 millones de registros, el caso es que va a seguir creciendo poco a poco.

Las consultas más frecuentes son
select from tabla where campo2 = tal limit 50
select from tabla where campo3 IN(arrayids)

y alguna búsqueda en concreto pero no es la utilidad principal.

El caso es que no se si mantener MyISAM o InnoDB por que en selects se supone que corre más el myisam pero como no hago búsquedas directamente sobre la base de datos quizás no sea lo más interesante.

Luego tengo otra tabla en la que sí hago búsquedas y serán unos 100.000 registros y van aumentando poco a poco, es un varchar de no más de 50 carácteres, también me interesaría optimizar esta tabla.

Si alguien me puede sacar de las dudas se lo agradecería.

Un saludo
MyIsam sería la respuesta, en teoría es más rápida y permite indices fulltext, InnoDB es transaccional es decir es mejor para insertar datos cuando hay tablas relacionadas pero en si es más lenta.

La diferencia fundamental es que en InnoDB podés producir bloqueos a nivel de fila, mientras que en MyIsam los bloqueos son a nivel de tabla.

En criollo:

Código:
CREATE TABLE `producto`(id INT NOT NULL AUTO_INCREMENT, valor INT);

CREATE TABLE `descripcion`(id INT, titulo VARCHAR(50));

LOCK TABLE `producto`,`descripcion` WRITE;

INSERT `producto` SET valor=1;

INSERT `descripcion` SET titulo='Un Titulo',id=LAST_INSERT_ID();

UNLOCK TABLES;
Como verás para relacionar la tabla producto con descripcion utilizo el id que se ha insertado en producto, para evitar errores he bloqueados la tabla de modo exclusivo por tanto nadie puede leer o escribir en ese momento.

En cambio en InnoDB no necesito bloquear toda la tabla, solo bloqueo la fila:

Código:
CREATE TABLE `producto`(id INT NOT NULL AUTO_INCREMENT, valor INT) ENGINE=InnoDB;

CREATE TABLE `descripcion`(id INT, titulo VARCHAR(50)) ENGINE=InnoDB;

SET autocommit=0;

BEGIN;

INSERT `producto` SET valor=1;

INSERT `descripcion` SET titulo='Un Titulo',id=LAST_INSERT_ID();

COMMIT;

SET autocommit=1;
Cualquiera puede estar leyendo o escribiendo en la tabla mientras realizas esta operación ya que el bloqueo esta dado en la fila y no en la tabla.

Por otra parte innoDB tiene ventajas con relaciones entre tablas, etc y MyIsam tienen indices Fulltext, etc y es más velóz.

No es una mejor que la otra simplemente son dos herramientas diferentes, tranquilamente una tabla puede ser MyIsam y otras innoDB pero ojo porque entre ambas no son compatible en cuanto a funcionalidades, por supuesto que podes leer y escribir en cualquiera.