Optimización Mysql

14 views
Skip to first unread message

jope18...@gmail.com

unread,
Dec 2, 2009, 12:55:59 PM12/2/09
to Grupo de programadores PHP de Barcelona
Hola,

Tengo dos consultas.

1.- Para que casos es mejor emplear MyISAM y para que casos es mejor
InnoDB??

2.- En una aplicación sencilla almaceno contenido. Quiero mostrar el
contenido más visto en la última semana, en el último mes, y filtros
similares. Para ello he creado una tabla "visitas_usuarios" donde
almaceno un id_contenido, la fecha, y otros datos por cada visita.
Ahora mismo la tabla contiene más de 1 millon de registros, y pesa 60
megas, por lo que intuyo que dentro de no mucho me dará problemas.
¿De que forma se puede crear este proceso sin recargar tanto la BD?
¿Esta es la más correcta?

Gracias de antemano.

pablof...@gmail.com

unread,
Dec 2, 2009, 1:04:31 PM12/2/09
to phpbar...@googlegroups.com
guarda los resultados que vas a mostrar en el cache, que puede ser un
archivo con la pagina a mostrar.


----------------------------------------
Pablo Morales
blog: http://blog.pablo-morales.com
linkedln: http://www.linkedin.com/pub/9/528/21
skype: pablofmorales
gtalk: pablof...@gmail.com
msn: pfm...@hotmail.com




2009/12/2 jope18...@gmail.com <jope18...@gmail.com>:

Jordi Roura

unread,
Dec 2, 2009, 1:15:16 PM12/2/09
to phpbar...@googlegroups.com
Realmente necesitas almacenar datos con tanto detalle? Quizas puedas
conseguir los resumenes que necesitas a partir de datos agregados
(como hace, por ejemplo, Google Analytics).

Salut!
--
Sent from my mobile device

Juanjo López Mellado

unread,
Dec 2, 2009, 2:13:38 PM12/2/09
to phpbar...@googlegroups.com


Hola,

Tengo dos consultas.

1.- Para que casos es mejor emplear MyISAM y para que casos es mejor
InnoDB??

InnoDB si necesitas integridad referencial o si tus consultas suelen seguir el
índice primario de las tablas (innodb guarda el índice y los datos juntos, por
tanto una consulta por índice requiere menos accesos a disco).

Por otro lado InnoDB es más sencillo de recuperar si hay un desastre (al menos
en teoría).

En cambio MyISAM es más fácil de hacer backup, por ejemplo. En general suele
ir más rápido, pero es muy relativo todo, mejor hacer pruebas, si puedes.
 

2.- En una aplicación sencilla almaceno contenido. Quiero mostrar el
contenido más visto en la última semana, en el último mes, y filtros
similares. Para ello he creado una tabla "visitas_usuarios" donde
almaceno un id_contenido, la fecha, y otros datos por cada visita.
Ahora mismo la tabla contiene más de 1 millon de registros, y pesa 60
megas, por lo que intuyo que dentro de no mucho me dará problemas.
¿De que forma se puede crear este proceso sin recargar tanto la BD?
¿Esta es la más correcta?

Yo cortaría las tablas. Deduzco que tienes una tabla donde guardas los datos diarios.
Esta tabla es la que puedes cortar. Cada lunes creas una nueva tabla y, durante toda
la semana, guardas allí los datos.

Luego, si quieres consultar todas las semanas de un mes, por ejemplo, puedes hacer
una tabla MERGE juntando las que toque.

Por cierto, en este caso mejor tablas MyISAM: así cada tabla nueva se correspondrá
con un fichero en el sistema operativo (Innodb guarda todas las tablas en un único
fichero)

Si el máximo que muestras, por ejemplo, es de medio año, borrar los datos anteriores
es muy sencillo, basta con hacer DROP TABLE por fecha, en vez del DELETE con
table scan que debes tener ahora.

En fin, a ver si te sirve.

 

Gracias de antemano.






--
Juanx
Informático de profesión y mejor persona :-D
No tengo "feisbuk", pero sí LinkedIn: http://www.linkedin.com/in/juanx
-- Si te gustan los coches visita mi desactualizado blog http://conplomo.blogspot.com --

Gabriel

unread,
Dec 2, 2009, 3:56:46 PM12/2/09
to phpbar...@googlegroups.com
Nasss,
 
La cosa yo la entiendo mas sencilla.
 
InnoDB, cuando se escribe, bloquea tablas a nivel de filas, las MyISAM la tabla entera.
Por tanto. Si hay mucha lectura y poca escritura: MyISAM.
 
De todas formas, no es muy complicado hacer un scipt en php emulando una prueba.
 
Saludos
 
- Gabrielón -

carlos campderrós

unread,
Dec 2, 2009, 5:43:24 PM12/2/09
to phpbar...@googlegroups.com
Hola,


1.- Para que casos es mejor emplear MyISAM y para que casos es mejor
InnoDB??

Yo uso siempre InnoDB. Valoro mucho más la integridad de los datos y el soporte para transacciones (y stored procedures y triggers) que la velocidad de lectura de los datos. El día que vea que el rendimiento de las consultas en la base de datos está afectando al rendimiento de la aplicación, ya veremos como me las apaño. Pero hasta entonces InnoDB hasta la muerte (por mis necesidades, que también hay que decir que no son muchas).

 
2.- En una aplicación sencilla almaceno contenido. Quiero mostrar el
contenido más visto en la última semana, en el último mes, y filtros
similares. Para ello he creado una tabla "visitas_usuarios" donde
almaceno un id_contenido, la fecha, y otros datos por cada visita.
Ahora mismo la tabla contiene más de 1 millon de registros, y pesa 60
megas, por lo que intuyo que dentro de no mucho me dará problemas.
¿De que forma se puede crear este proceso sin recargar tanto la BD?
¿Esta es la más correcta?

Con recargar tanto la BD a qué te refieres? A meterle tanto contenido o a extraer los informes más rápidamente?

Si es por el meterle tanto contenido... solo veo una respuesta: no se lo metas xD Borra los registros que realmente ya no necesites. Crea tablas con los resúmenes que visualizas de el último mes, semana, etc y elimina esos registros de la tabla diaria.

Para ganar rapidez al mostrarlo, indexa todos los campos que uses en tus consultas para el WHERE o ORDER BY (supongo que seran id_contenido y/o fecha). Y si vas moviendo todos los registros a tablas de resúmenes semanales o mensuales como te comentaba antes, reducirás considerablemente el tamaño de esta tabla con lo que también obtendrás resultados mucho más rápidamente.


saludos,
carlos.

--
Si no puedes deslumbrar con tu sabiduría,
desconcierta con tus gilipolleces

chema

unread,
Dec 3, 2009, 3:50:30 PM12/3/09
to Grupo de programadores PHP de Barcelona
Al leer pensé que era a nivel mas físico. Igualmente puedo compartir
estos enales que son interesantes:

http://www.xtec.es/~acastan/textos/Tuning%20LAMP.pdf
https://launchpad.net/mysql-tuning-primer
http://neo22s.com/improve-lamp-performance-for-low-cost-servers-or-vps/

On 2 dic, 18:55, "jope18jos...@gmail.com" <jope18jos...@gmail.com>
wrote:

Nenillo

unread,
Dec 6, 2009, 1:59:21 PM12/6/09
to Grupo de programadores PHP de Barcelona
Una cosa importante que diferencia InnoDB y MyISAM en cuanto a
rendimiento es que InnoDB es capaz de bloquear las tablas a nivel de
registro, en cambio, MyISAM bloquea las tablas por completo.

60MB no es nada, es "calderilla" para MySQL si tienes bien puestos los
índices, pero si crece, puede haber un momento en el que tengas un
SELECT algo pesado mientras tienes varios INSERT por cada visita. Con
MyISAM el SELECT te bloqueará los INSERT y se te puede quedar
momentamente toda la web parada.

Por una parte para solucionar el tema de los INSERT, si no necesitas
el último ID insertado en la tabla puedes usar INSERT DELAYED. Si usas
INSERT DELAYED la operación no te bloqueará la llamada mysql_query y
nunca se te quedará bloqueada la web con los inserts.

En cuanto a las estadísticas que quieres mostrar, lo más recomendable
es que las cachees y se generen a una hora que haya poco tráfico.

Usando estas dos técnicas es indiferente si usas InnoDB o MyISAM.

On 2 dic, 18:55, "jope18jos...@gmail.com" <jope18jos...@gmail.com>
wrote:
Reply all
Reply to author
Forward
0 new messages