WaterDark escribió:Mira el administrador de tareas, a ver el uso de CPU y RAM, y asi saber que te está limitando.
Que CPU tenía la máquina de 8GB y que CPU tiene la de 4GB?
Que servidor/stack estas usando?
banderas20 escribió:Buenas.
Estoy desarrollando con Wordpress y uso unos ficheros PHP que consultan a una BBDD MySQL.
En una máquina con 8GB de RAM y config por defecto no hay problemas. Lo estoy migrando a otra con 4GB y el rendimiento es horrible. Tanto que me da errores de timeout incluso subiéndolo a 100 segundos.
Ambos son Win7 de 64 bits. La máquina que da problemas tiene instalado lo básico. No entiendo qué puede estar pasando.
¿Alguna pista?
Gracias!
Stylish escribió:Si tienes timeouts con 100 segundos, algo bien gordo tienes montado. Ni te molestes con el administrador de tareas y mira las queries que tengas en ejecución, tienes alguna muy mal montada. O queries en bucles, o insert continuos individuales, o select consecutivos en tablas grandes sin índices.... O todas a la vez, con 100 segundos...
WaterDark escribió:Hay una diferencia importante en la CPU, al menos 4 veces menos potente.
La base de datos que consultas con los scripts PHP tuyos propios es la de wordpress o es una propia?
WaterDark escribió:Es posible que compartas la estructura de la DB y las consultas que te van lentas?
WaterDark escribió:Es posible que en PHP estes realizando un bucle de consultas? osea, en phpmyadmin te va rapido porque ejecutas una consulta, pero si en PHP estas ejecuntando una consulta muchas veces, pues normal que vaya mas lento.
select (from_unixtime(fechas.fecha)) as fecha_hr,
FORMAT(datosTE.valor,2) as TE,
FORMAT(datosT1.valor,2) as T1,
FORMAT(datosT2.valor,2) as T2
from (select distinct (fecha) from datos) as fechas
left join (select * from datos where idvariable=5) as datosTE on fechas.fecha=datosTE.fecha
left join (select * from datos where idvariable=1) as datosT1 on fechas.fecha=datosT1.fecha
left join (select * from datos where idvariable=3) as datosT2 on fechas.fecha=datosT2.fecha
order by fechas.fecha asc limit 100
WaterDark escribió:Sabes si tienes activo la cache de consultas? quizas en el viejo entorno lo tenias y en este no, y puede ser parte de la diferencia que notas.
banderas20 escribió:WaterDark escribió:Es posible que compartas la estructura de la DB y las consultas que te van lentas?
No entiendo bien lo que me preguntas. ¿Cómo puedo comprobarlo?WaterDark escribió:Es posible que en PHP estes realizando un bucle de consultas? osea, en phpmyadmin te va rapido porque ejecutas una consulta, pero si en PHP estas ejecuntando una consulta muchas veces, pues normal que vaya mas lento.
Hay algunos PHP que hacen bucles, pero donde me encuentro problemas es en algunos PHP que hacen una única consulta. Eso sí, son consultas complejas que contienen joins entre tres tablas. Para que te hagas una idea, la consulta es ésta:select (from_unixtime(fechas.fecha)) as fecha_hr,
FORMAT(datosTE.valor,2) as TE,
FORMAT(datosT1.valor,2) as T1,
FORMAT(datosT2.valor,2) as T2
from (select distinct (fecha) from datos) as fechas
left join (select * from datos where idvariable=5) as datosTE on fechas.fecha=datosTE.fecha
left join (select * from datos where idvariable=1) as datosT1 on fechas.fecha=datosT1.fecha
left join (select * from datos where idvariable=3) as datosT2 on fechas.fecha=datosT2.fecha
order by fechas.fecha asc limit 100
Esta consulta en PHPMyAdmin me tarda 174.3808 segundos en un PC y 0.0630 segundos en otro. No me explico la brutal diferencia...WaterDark escribió:Sabes si tienes activo la cache de consultas? quizas en el viejo entorno lo tenias y en este no, y puede ser parte de la diferencia que notas.
De nuevo desconozco lo que me preguntas. ¿Cómo lo compruebo?
Muchísimas gracias por la ayuda!
banderas20 escribió:WaterDark escribió:Es posible que compartas la estructura de la DB y las consultas que te van lentas?
No entiendo bien lo que me preguntas. ¿Cómo puedo comprobarlo?
banderas20 escribió:Hay algunos PHP que hacen bucles, pero donde me encuentro problemas es en algunos PHP que hacen una única consulta. Eso sí, son consultas complejas que contienen joins entre tres tablas. Para que te hagas una idea, la consulta es ésta:select (from_unixtime(fechas.fecha)) as fecha_hr,
FORMAT(datosTE.valor,2) as TE,
FORMAT(datosT1.valor,2) as T1,
FORMAT(datosT2.valor,2) as T2
from (select distinct (fecha) from datos) as fechas
left join (select * from datos where idvariable=5) as datosTE on fechas.fecha=datosTE.fecha
left join (select * from datos where idvariable=1) as datosT1 on fechas.fecha=datosT1.fecha
left join (select * from datos where idvariable=3) as datosT2 on fechas.fecha=datosT2.fecha
order by fechas.fecha asc limit 100
Esta consulta en PHPMyAdmin me tarda 174.3808 segundos en un PC y 0.0630 segundos en otro. No me explico la brutal diferencia...
banderas20 escribió:WaterDark escribió:Sabes si tienes activo la cache de consultas? quizas en el viejo entorno lo tenias y en este no, y puede ser parte de la diferencia que notas.
De nuevo desconozco lo que me preguntas. ¿Cómo lo compruebo?
1 PRIMARY <derived2> ALL 34944 Using filesort
1 PRIMARY <derived3> ref <auto_key0> <auto_key0> 4 fechas.fecha 10
1 PRIMARY <derived4> ref <auto_key0> <auto_key0> 4 fechas.fecha 10
1 PRIMARY <derived5> ref <auto_key0> <auto_key0> 4 fechas.fecha 10
5 DERIVED datos ALL 34944 Using where
4 DERIVED datos ALL 34944 Using where
3 DERIVED datos ALL 34944 Using where
2 DERIVED datos ALL 34944 Using temporary
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived2> NULL ALL NULL NULL NULL NULL 35030 100.00 Using temporary; Using filesort
1 PRIMARY datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using where; Using join buffer (Block Nested Loop)
1 PRIMARY datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using where; Using join buffer (Block Nested Loop)
1 PRIMARY datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using where; Using join buffer (Block Nested Loop)
2 DERIVED datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using temporary
banderas20 escribió:@luciferfran
Ambos Windows 7 son calcados, y el Appserv es el mismo. Igualmente, comprobaré a ver si el PHP es de 64 bits.
@Stylish
Las salidas son diferentes. ¿Qué significa? ¿Se puede hacer algo?:
En el PC rápido:1 PRIMARY <derived2> ALL 34944 Using filesort
1 PRIMARY <derived3> ref <auto_key0> <auto_key0> 4 fechas.fecha 10
1 PRIMARY <derived4> ref <auto_key0> <auto_key0> 4 fechas.fecha 10
1 PRIMARY <derived5> ref <auto_key0> <auto_key0> 4 fechas.fecha 10
5 DERIVED datos ALL 34944 Using where
4 DERIVED datos ALL 34944 Using where
3 DERIVED datos ALL 34944 Using where
2 DERIVED datos ALL 34944 Using temporary
En el PC lentoid select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived2> NULL ALL NULL NULL NULL NULL 35030 100.00 Using temporary; Using filesort
1 PRIMARY datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using where; Using join buffer (Block Nested Loop)
1 PRIMARY datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using where; Using join buffer (Block Nested Loop)
1 PRIMARY datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using where; Using join buffer (Block Nested Loop)
2 DERIVED datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using temporary
@cipoteloth
Si son índices, ¿por qué esa diferencia tan brutal de rendimiento cuando ambas BBDDs son calcos una de la otra?
No tengo tiempo de probarlo en un entorno Linux. Estoy migrando voy un poco contrarreloj.![]()
Mira las salidas de EXPLAIN que he pegado a ver si te dicen algo.
@WaterDark
La migración la he hecho exportando e importando desde y hacia PHPMyAdmin. Entiendo que esto respeta las claves principales. idvariable es primaria, sí. Aunque uso otros campos para hacer los JOIN.
query_cache_type está a OFF en ambos PCs.
Muchas gracias a todos!
join_buffer_size 262144
sort_buffer_size 262144
max_heap_table_size 16777216
tmp_table_size 519045120
join_buffer_size 262144
sort_buffer_size 262144
max_heap_table_size 16777216
tmp_table_size 34603008
SHOW INDEXES FROM datos;
banderas20 escribió:@WaterDark
PC Viejo:join_buffer_size 262144
sort_buffer_size 262144
max_heap_table_size 16777216
tmp_table_size 519045120
PC Potentejoin_buffer_size 262144
sort_buffer_size 262144
max_heap_table_size 16777216
tmp_table_size 34603008devuelve 0 resultados en ambos PCs.SHOW INDEXES FROM datos;
Ambos PCs tienen HD normal. no SSD.
Y acabo de ver que sólo tengo "my.ini" en el PC viejo, porque creo que ahí instalé primero MySQL aparte del paquete WAMP.
De hecho, debajo de "Appserv" sólo existe la carpeta "MySQL" en el PC viejo.
Por cierto,
PC Viejo: Appserv8.1.0
PC Nuevo: Appserv8.1.3
Lo que no sé es qué MySQL está usando el PC nuevo, si no existe dicha carpeta.
¿por cuál de todas estas diferencias la puedo estar cagando?![]()
@Stylish
Lo que he hecho siempre es un DROP DATABASE, luego exporto de uno y luego vuelvo a importar en otro.
¿Cómo pongo los índices igual? ¿Qué es lo que he hecho mal con la estructura y cómo evito que me vuelva a pasar?
Os debo una birra a todos!
WaterDark escribió:@banderas20 pero no habías dicho que el campo idvariable es una llave primaria??
Un índice es como guardar un resumen en la RAM sobre los distintos valores de un campo y donde encontrar las filas que corresponde con cada valor, de forma que mejora el rendimiento de las consultas que busquen resultados basándose en el campo indexado.
Cuando declaras un campo como llave primaria, ajena o único, se crea automáticamente un índice para ese campo. También puedes crear índices específicamente para un campo que no tiene por que ser una llave primaria, ajena o único.
Normalmente los campos que se usan para hacer los JOIN deben tener un índice, sino la unión es muy lenta.
También se suelen asignar índices a algunos campos que se usan mucho en la clausula WHERE y ORDER.
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 PRIMARY <derived2> NULL ALL NULL NULL NULL NULL 35030 100.00 Using temporary; Using filesort
1 PRIMARY datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using where; Using join buffer (Block Nested Loop)
1 PRIMARY datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using where; Using join buffer (Block Nested Loop)
1 PRIMARY datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using where; Using join buffer (Block Nested Loop)
2 DERIVED datos NULL ALL NULL NULL NULL NULL 35030 100.00 Using temporary
left join (select * from datos where idvariable=5) as datosTE on fechas.fecha=datosTE.fecha
left join (select * from datos where idvariable=1) as datosT1 on fechas.fecha=datosT1.fecha
left join (select * from datos where idvariable=3) as datosT2 on fechas.fecha=datosT2.fecha
left join (select * from datos where idvariable=5) as datosTE on datosTE.fecha=fechas.fecha
left join (select * from datos where idvariable=1) as datosT1 on datosT1.fecha=fechas.fecha
left join (select * from datos where idvariable=3) as datosT2 on datosT2.fecha=fechas.fecha
ALTER TABLE datos ADD INDEX(idvariable);
ALTER TABLE datos ADD INDEX(fecha);
WaterDark escribió:@banderas20 pero solo con cambiar el valor de tmp_table_size va rápido? en el pc viejo tenía el valor que acabas de cambiar y es lo que posiblemente hace que vaya rápido.
SELECT
FROM_UNIXTIME(fechas.fecha) AS fecha_hr,
FORMAT(datosTE.valor,2) AS TE,
FORMAT(datosT1.valor,2) AS T1,
FORMAT(datosT2.valor,2) AS T2
FROM (SELECT distinct (fecha) FROM datos) AS fechas
LEFT JOIN datos AS datosTE ON datosTE.fecha=fechas.fecha AND datosTE.idvariable=5
LEFT JOIN datos AS datosT1 ON datosT1.fecha=fechas.fecha AND datosT1.idvariable=1
LEFT JOIN datos AS datosT2 ON datosT2.fecha=fechas.fecha AND datosT2.idvariable=3
ORDER BY fechas.fecha ASC
LIMIT 100