Optimización con foreach en PHP para conteos múltiples en MySQL

  • Autor Autor shadowhck
  • Fecha de inicio Fecha de inicio
shadowhck

shadowhck

Lambda
Programador
Hola

Tengo un archivo de configuración con una lista de estados de contenido, y una lista de tipos de contenido. Estoy usando foreach en PHP para realizar varios count de la misma tabla pero con diferentes condiciones.

Son 2 tipos de contenido y son 4 estados. He leído que los count son algo lentos.

ejemplo
WHERE content_type = 'esto' AND WHERE 'status' = 0

Tabla:
Insertar CODE, HTML o PHP:
+--------------+------------------+------+-----+---------+----------------+
| Field        | Type             | Null | Key | Default | Extra          |
+--------------+------------------+------+-----+---------+----------------+
| id           | int(11) unsigned | NO   | PRI | NULL    | auto_increment |
| status       | int(11) unsigned | NO   | MUL | NULL    |                |
| title        | varchar(255)     | NO   |     | NULL    |                |
| slug         | varchar(255)     | NO   | UNI | NULL    |                |
| content_type | varchar(50)      | NO   |     | NULL    |                |
| user_id      | int(11) unsigned | NO   | MUL | NULL    |                |
| sticky       | int(11) unsigned | YES  |     | NULL    |                |
| comment      | int(11) unsigned | YES  |     | NULL    |                |
| created      | datetime         | NO   |     | NULL    |                |
| modified     | datetime         | YES  |     | NULL    |                |
+--------------+------------------+------+-----+---------+----------------+

Que es lo más eficiente? Hay alguna alternativa para no tener que usar tantas queries si solo se trata de una tabla?

Saludos.
 
solo necesitas contarlos o que?... algo facil seria:
PHP:
$A = $mysqli->query("SELECT * FROM TABLA WHERE content_type = 'esto' AND WHERE 'status' = 0");
echo "Cantidad: ".$A->num_rows;

eso te sirve?
 
solo necesitas contarlos o que?... algo facil seria:
PHP:
$A = $mysqli->query("SELECT * FROM TABLA WHERE content_type = 'esto' AND WHERE 'status' = 0");
echo "Cantidad: ".$A->num_rows;

eso te sirve?

Tengo las queries, solo necesito saber si existe una mejor forma de hacerlo ya que en el ejemplo (real) son 8 queries solo para contar el mismo contenido. Podria usar indices para que los count sean más eficientes? Que pasaria si fueran miles de rows, serian escasos milisegundos?
 
Tengo las queries, solo necesito saber si existe una mejor forma de hacerlo ya que en el ejemplo (real) son 8 queries solo para contar el mismo contenido. Podria usar indices para que los count sean más eficientes? Que pasaria si fueran miles de rows, serian escasos milisegundos?

y lo mejor es llenrar una tabla con dummy y hacer test de cual rendiria mejor... lo puedes hacer en local asi no tienes que andar en el server... y es como decis, todo se basa en milisegundos... el tema no seria el count, sino seria muchos usuarios haciendo llamada a ese count... podras tener muchos datos (tengo una tabla con 6millones de datos) y si los usuarios no la sobrecargan no hay problema... en cambio tengo otro sitio el cual tuve que optimizar muchas cosas... ya que por la cantidad de usuarios que movia se moria el mysql. Pase a inooDB mis tablas asi no se corrompian facil (ya que al hacer tantas consultas, algunas quedaban abiertas y me daba lata) ... pero todo es prueba y error...

Trata de ideartelas para hacer un test de streess a tu mysql con dummy data...
How do I... Stress test MySQL with mysqlslap? - TechRepublic
 
y lo mejor es llenrar una tabla con dummy y hacer test de cual rendiria mejor... lo puedes hacer en local asi no tienes que andar en el server... y es como decis, todo se basa en milisegundos... el tema no seria el count, sino seria muchos usuarios haciendo llamada a ese count... podras tener muchos datos (tengo una tabla con 6millones de datos) y si los usuarios no la sobrecargan no hay problema... en cambio tengo otro sitio el cual tuve que optimizar muchas cosas... ya que por la cantidad de usuarios que movia se moria el mysql. Pase a inooDB mis tablas asi no se corrompian facil (ya que al hacer tantas consultas, algunas quedaban abiertas y me daba lata) ... pero todo es prueba y error...

Trata de ideartelas para hacer un test de streess a tu mysql con dummy data...
How do I... Stress test MySQL with mysqlslap? - TechRepublic

Exactamente estaba leyendo sobre mysqlslap. Gracias por la recomendación.

Debería dejar las optimizaciones para lo ultimo ya que creo que esta es una.
 
De normal, siempre hay que analizar cada caso. Hacer una consulta es más eficiente que realizar multiples.. más que nada por que es conectar a la BBDD, pasar por el optimizador, devolver resultados.. y esto varias veces.
En el caso de tu consulta, creo que la mejor opción sería utilizar el group by, con lo que comentas sería algo como esto

select conten_type, status, count(1) as total from TABLA
group by content_type,status;

Para que fuera óptima en content_type y en status necesitarias crear unos indices.

y si no necesitas todos los status o todos los content_type, añade en la condición WHERE aquellos que necesites.


WHERE content_type in('valor1','valor2','valor3') AND WHERE 'status' = 0 <-- por ejemplo
 
Atrás
Arriba