[Php-avanzado] recordando conceptos---Conexiones persistentes MySQL-- me convienen ? cuando?
Rama Gonzalo
ramagonzalo en yahoo.com.ar
Mie Sep 1 15:07:11 ART 2010
Gracias Leo, Gracias Matias, muy buena toda la info, muchas cosas a
probar, voy a comenzar, luego les comentaré.
Saludos!
> Hola, Gonzalo.
>
> El tema de la optimización de la DB no es nada trivial ni simple.
>
> Los problemas, como decis, vienen de varios lugares. Algunos
> importantes son: la capacidad del server, la configuración del motor,
> la calidad de las consultas y el buen uso de los indices.
>
> Si tenes ganas de meterte con los tres últimos puntos:
>
> Para empezar bajate mysqltuner.pl <http://mysqltuner.pl>, dale
> permisos y ejecutalo (necesitás el usuario y pass del admin del motor
> mysql). Es un script que analiza tu configuración de mysql y compara
> con las estadísticas del motor para decirte que valores se pueden
> mejorar. Te lo bajas con:
>
> wget mysqltuner.pl <http://mysqltuner.pl>
>
>
> Por otro lado, hay consultas que le exigen muchos recursos a la db.
> Por ejemplo, las consultas con ORDER BY RAND() son muy intensivas para
> el motor, por el modo de funcionar de las mismas. Con tablas medio
> chicas (unos 300 registros) en un server no muy importante se nota
> mucho la diferencia.
>
> Otra cosa, intentá no usar funciones en el server para hacer las
> comparaciones/ordenamientos. Por ejemplo, haciendo un buscador,
> necesitaba calcular la distancia de Levenstein (un valor que te da la
> diferencia entre dos palabras, sirve para hacer el "Quizás quiso
> decir..."). Probé con una función en el motor, trayendo las 3 palabras
> mas similares y probé trayendo todo el diccionario (unas 3000
> palabras) y calculando la distancia con php. La última opción resultó
> mucho más rápida y menos intensiva para el procesador.
>
>
> Otro de los problemas que podés tener de rendimiento en las
> consultas (y para mi uno de los más importantes) es el uso de los
> índices. Una consulta que busca un registro en una tabla sin índices
> puede tener que recorrer toda la tabla. Con el ratio de inserciones
> que tenés, calculo que tus tablas no debe ser chicas. Esto es una
> patada al server.
>
> Para detectar consultas que no tienen índices podés activar el "mysql
> slow query log" en el archivo de configuración my.cnf.
> Esta es mi config (para la version 5.1.43, para versiones anteriores
> fijate en el manual o en la pagina de mysql porque algunas son distintas):
> log_slow_queries = /usr/local/mysql/data/mysql-slow.log
> long_query_time = 5
> log-queries-not-using-indexes
>
> El archivo lo podés analizar con:
> mysqldumpslow -t 10 /usr/local/mysql/data/mysql-slow.log
>
> Eso te va a dar las 10 consultas que más tiempo tarden en ejecutarse.
> Buscá otros parámetros en la ayuda del programa, para ver las
> consultas que más se ejecutan, etc.
>
> Una vez que tengas la consulta que te interesa, podés usar la
> sentencia EXPLAIN de mysql y ver la salida. Por ejemplo, vamos a tomar
> una consulta:
> SELECT notas.*,usuarios.username FROM notas JOIN usuarios ON
> usuarios.id <http://usuarios.id>=notas.id_usuario LIMIT 10
> Para analizarla, ejecutaríamos:
> EXPLAIN SELECT notas.*,usuarios.username FROM notas JOIN usuarios ON
> usuarios.id <http://usuarios.id>=notas.id_usuario LIMIT 10
>
> El resultado es algo así (en el mail se va a ver feo, miralo por
> pantalla o copialo-pegalo y acomodá las lineas):
> +----+-------------+-------------+--------+---------------+---------+---------+----------------------------------------------+------+-------+
> | id | select_type | table | type | possible_keys | key |
> key_len | ref | rows | Extra |
> +----+-------------+-------------+--------+---------------+---------+---------+----------------------------------------------+------+-------+
> | 1 | SIMPLE | comentarios | ALL | NULL | NULL |
> NULL | NULL | 192 | |
> | 1 | SIMPLE | usuarios | eq_ref | PRIMARY | PRIMARY |
> 4 | hispabodas_hispabodas.comentarios.id_usuario | 1 | |
> +----+-------------+-------------+--------+---------------+---------+---------+----------------------------------------------+------+-------+
> En esta respuesta el server nos dice las tablas que se consultaron, el
> orden en que se consultan, los posibles índices a usar, los que se
> usaron, la referencia del indice a otras tablas, la cantidad de
> registros que se consultaron de la tabla e información extra.
>
> Con todos estos datos podés analizar un poco mejor la consulta, saber
> cómo la ve el motor y optimizarla.
>
> Como comentario final, acordate que cada índice que agregues a la
> tabla la hace más rápida al consultar, pero más lenta al
> insertar/eliminar/modificar. No te excedas con los índices que no se
> usan porque puede ser contraproducente.
>
> Con esto vas a poder optimizar algunas consultas, por lo menos las que
> más consumen. Después de dejar todo 10 puntos, vas a tener que meterte
> con otras opciones, como te decía Leo. El caché es una muy buena
> opción. A mi me bajó el uso del procesador por parte del motor del 80%
> (antes del cache) al 20% (despues del cache).
>
> Yo no usaría conexiones persistentes, por todo lo que te dijo Leo.
>
> Lo que si deberías hacer es (si usás php-mysql) usar la librería
> mysqli (no la mysql) que está más optimizada para motores nuevos (a
> partir de 5.0).
>
> Estoy a punto de escribir algo un poco más detallado sobre esto.
> Cuando tenga tiempo lo haré.
>
> Cualquier cosa avisá y reportá resultados.
>
> Saludos, Matias.
>
>
> El 31 de agosto de 2010 18:17, Leonardo Tadei - Pegasus Tech Supply
> <leonardot en pegasusnet.com.ar <mailto:leonardot en pegasusnet.com.ar>>
> escribió:
>
> Hola Gonzalo,
>
> El mar, 31-08-2010 a las 06:34 -0300, Rama Gonzalo escribió:
> > Hola, tengo una DB con algo mas de 140 consultas y 10 inserciones
> > aprox. por segundo (usuarios diferentes) y tengo problemas en el
> > rendimientos, desde ya que se puede deber a mil cosas, pero quisiera
> > saber si las conexiones persistentes me pueden ayudar a mejorar
> un poco
> > o complicaría más la cosa.
> > Y en que casos en conveniente y en cuales no.
>
> Casi nunca convienen las conexiones persistentes, y sobre
> todo, no son
> aplicables cuando los usuarios de la DB son distintos.
> Si implementás conexiones persistentes, tenés que tener
> mucho, pero
> mucho cuidado de cerrarlas correctamente, porque si no se te cae el
> server por demasiadas conexiones abiertas.
>
> Para este caso, tal vez te convenga más implementar un
> sistema de
> caché, para que las 140 consultas bajen a la misma cantidad que
> tenés de
> inserciones.
>
> Después, el paso que sigue son tablas en RAM, y bajarlas a
> disco cada
> tanto, y de ahí pasás a clusterizar el almacenamiento o pasarte a
> DB no
> relacionales, que según dicen pero yo no probé, tienen muy buen
> rendimiento bajo estos escenarios, aunque en el camino perdés la
> consistencia automática de los almacenamientos.
>
> > Muchas gracias.
>
> Por nada!
>
> --
>
> Leonardo Tadei
> leonardot en pegasusnet.com.ar <mailto:leonardot en pegasusnet.com.ar>
> http://blog.pegasusnet.com.ar
> Firma pública: http://www.pegasusnet.com.ar/LeonardoTadei-public.key
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> <mailto:Php-avanzado en pato2.fi.mdp.edu.ar>
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
>
>
>
>
> --
> Matias Fernando Gea
> matigea en gmail.com <mailto:matigea en gmail.com>
> http://www.mfgea.com.ar
>
>
> _______________________________________________
> Php-avanzado mailing list
> Php-avanzado en pato2.fi.mdp.edu.ar
> http://www3.fi.mdp.edu.ar/cgi-bin/mailman/listinfo/php-avanzado
Más información sobre la lista de distribución Php-avanzado