Contar múltiples consultas

X

xcodex

Hola!.
Tengo una web en la que tengo que contar cuantos artículos hay en cada sección:
Por ejemplo:

Artículos A (aquí mostrar cantidad).
Artículos B (aquí mostrar cantidad).
Artículos C (aquí mostrar cantidad).
Artículos D (aquí mostrar cantidad).

El problema es que tengo 28, y no creo que lo mas conveniente sea relizar 28 consultas, y mas teniendo en cuenta que es una web con bastante tráfico.

¿Hay alguna manera de optimizar esto?.
 

Mask7OfDragon

Zeta
Programador
Verificación en dos pasos desactivada
Desde
17 Mar 2017
Mensajes
1.627
Edad
20
1 No uses mysql, mysqli o cualquier libreria nativa de PHP. Usa medoo.in, eloquent o cualquier sistema de manejador de bases de datos avanzado
2 Añade un cache a la consulta, cada 12 horas haga el conteo.

3 Realiza consultas anidadas.
  1. LEFT JOIN
  2. RIGH JOIN
  3. FULL JOIN
  4. INNER JOIN
En tu caso el mejor es el tercero. para anidar las 28 consultas en un solo resultado y no en un arreglo.


busca consultas anidadas o los conceptos JOIN de Mysql.
 
X

xcodex

1 No uses mysql, mysqli o cualquier libreria nativa de PHP. Usa medoo.in, eloquent o cualquier sistema de manejador de bases de datos avanzado
2 Añade un cache a la consulta, cada 12 horas haga el conteo.

3 Realiza consultas anidadas.
  1. LEFT JOIN
  2. RIGH JOIN
  3. FULL JOIN
  4. INNER JOIN
En tu caso el mejor es el tercero. para anidar las 28 consultas en un solo resultado y no en un arreglo.


busca consultas anidadas o los conceptos JOIN de Mysql.
¡Muchas gracias por la ayuda! 😎
 

Martin95

VIP
Beta
Programador
Verificación en dos pasos desactivada
Verificado por Whatsapp
Desde
20 Ene 2020
Mensajes
47
Yo te recomiendo la vieja confiable:
Crea 1 tabla TOTALES:
ID = 1
TOTAL Artículos A
TOTAL Artículos B
TOTAL Artículos C
TOTAL Artículos D

Ahora ingresa el total actual y después cada vez que alguien agrega un articulo sumas un numero al numero existente (+1) o si eliminan algún articulo restas un numero al numero existente (-1),.
Despues solo es hacer una consulta "Select * from TOTALES" y imprimir/usar los resultados.
Con eso te evitas mucho dolor de cabeza.
 

CristianGno

Gamma
Verificación en dos pasos desactivada
Verificado por Whatsapp
Desde
16 May 2015
Mensajes
226
Suponiendo que los artículos tienen un campo que denota su sección (lo supongo de ma info que das, si es errada agradezco aportes más info) lo más fácil sería usar agrupación, por ejemplo:

Select count(id) as total, seccion from artículos Group by seccion

Y con eso bastaría.
 

Mask7OfDragon

Zeta
Programador
Verificación en dos pasos desactivada
Desde
17 Mar 2017
Mensajes
1.627
Edad
20
Yo te recomiendo la vieja confiable:
Crea 1 tabla TOTALES:
ID = 1
TOTAL Artículos A
TOTAL Artículos B
TOTAL Artículos C
TOTAL Artículos D

Ahora ingresa el total actual y después cada vez que alguien agrega un articulo sumas un numero al numero existente (+1) o si eliminan algún articulo restas un numero al numero existente (-1),.
Despues solo es hacer una consulta "Select * from TOTALES" y imprimir/usar los resultados.
Con eso te evitas mucho dolor de cabeza.
esto ademas de ineficiente es peligroso.
 

Martin95

VIP
Beta
Programador
Verificación en dos pasos desactivada
Verificado por Whatsapp
Desde
20 Ene 2020
Mensajes
47
ineficiente, cuando tenga 5.000 usuarios matas la db.
Entiendo que creas que es ineficiente, pero necesito más detalles y una explicación con ejemplos en lo posible de por que es así como vos decís, si no, es tu palabra contra la mía y no hay pruebas o evidencias de que vos tengas razón y yo no. Esto te lo pido, por que si estoy equivocado, quiero aprender.
Desde mi punto de vista, la solución mía, es valida, maneje bases de datos de mas de 50.000 usuarios y nunca ningún problema.
 

Mask7OfDragon

Zeta
Programador
Verificación en dos pasos desactivada
Desde
17 Mar 2017
Mensajes
1.627
Edad
20
Entiendo que creas que es ineficiente, pero necesito más detalles y una explicación con ejemplos en lo posible de por que es así como vos decís, si no, es tu palabra contra la mía y no hay pruebas o evidencias de que vos tengas razón y yo no. Esto te lo pido, por que si estoy equivocado, quiero aprender.
Desde mi punto de vista, la solución mía, es valida, maneje bases de datos de mas de 50.000 usuarios y nunca ningún problema.
yo he manejado bases con hasta 5.000.000 de qps y hasta 7.500.000 ccu diarios


por otro lado es ineficiente porque cada solicitud requiere de dos acciones

la primera, estas creando una tabla que no es necesaria afectando indices y datos de la misma. y estas agrupando tablas en varias.
segundo estas sumando o restando por cada solicitud. esto a la larga desgasta las tablas e de-incrementa su velocidad. puede que con 5 o 10 querys por segundo no sea un problema pero cuando tengas 5.000 o 15.000 la base de datos se satura.
lo que llega a lo segundo, es peligroso porque saturas la base de datos, vuelves lento la web y puedes ocasionar caidas del modulo de php lo que revela el codigo php ya que lo imprime como si fuera un texto plano.

hay formas de hacerlo mas eficiente

ejemplo usando JOIN guardas cada 5 minutos en cache todos los resultados asi solo haras una consulta cada 5 minutos sin importar tus usuarios.
si necesitas sumar o incrementar.

debes crear un DRC o usar Eloquent con cache.
establezca DRC o Eloquent a 5 minutos de cache haga la consulta y sume y reste dependiendo del caso. esto es eficiente ya que el sistema sumara en disco, en variable o en cache y cada 5 minutos insertara la nueva información en la base de datos. asi tendrá solo 1 consulta cada 5 minutos.

PD:
si usas mysqli o las dependencias de php, ya lo estas haciendo mal de base.
 
Última edición:

Martin95

VIP
Beta
Programador
Verificación en dos pasos desactivada
Verificado por Whatsapp
Desde
20 Ene 2020
Mensajes
47
yo he manejado bases con hasta 5.000.000 de qps y hasta 7.500.000 ccu diarios


por otro lado es ineficiente porque cada solicitud requiere de dos acciones

la primera, estas creando una tabla que no es necesaria afectando indices y datos de la misma. y estas agrupando tablas en varias.
segundo estas sumando o restando por cada solicitud. esto a la larga desgasta las tablas e de-incrementa su velocidad. puede que con 5 o 10 querys por segundo no sea un problema pero cuando tengas 5.000 o 15.000 la base de datos se satura.
lo que llega a lo segundo, es peligroso porque saturas la base de datos, vuelves lento la web y puedes ocasionar caidas del modulo de php lo que revela el codigo php ya que lo imprime como si fuera un texto plano.

hay formas de hacerlo mas eficiente

ejemplo usando JOIN guardas cada 5 minutos en cache todos los resultados asi solo haras una consulta cada 5 minutos sin importar tus usuarios.
si necesitas sumar o incrementar.

debes crear un DRC o usar Eloquent con cache.
establezca DRC o Eloquent a 5 minutos de cache haga la consulta y sume y reste dependiendo del caso. esto es eficiente ya que el sistema sumara en disco, en variable o en cache y cada 5 minutos insertara la nueva información en la base de datos. asi tendrá solo 1 consulta cada 5 minutos.

PD:
si usas mysqli o las dependencias de php, ya lo estas haciendo mal de base.
Entiendo lo que decís pero a la vez no lo entiendo por que se saturaría la base de datos si solo se hace una consulta al total de los artículos.
O sea, yo tengo una tabla con los valores totales, esta no se modifica a menos que algún usuario agregue/elimine un Articulo en el Blog/web.
El objetivo era hacer una consulta rápida para saber los totales de los artículos y creo que de la forma que explique, se esta consiguiendo sin librerías o frameworks externos pero es funcional, fácil de implementar y ligero. Literalmente solo se hace una consulta a una tabla y ya.
Vos propones una solución compleja que no digo que este mal, pero quiero entender el por que es mejor. hasta ahora, veo algo complejo de integrar, que me da la misma solución.
Podrías hacer un video explicando por que es mejor a tu manera? Literalmente me interesa.
 

Mask7OfDragon

Zeta
Programador
Verificación en dos pasos desactivada
Desde
17 Mar 2017
Mensajes
1.627
Edad
20
Entiendo lo que decís pero a la vez no lo entiendo por que se saturaría la base de datos si solo se hace una consulta al total de los artículos.
O sea, yo tengo una tabla con los valores totales, esta no se modifica a menos que algún usuario agregue/elimine un Articulo en el Blog/web.
El objetivo era hacer una consulta rápida para saber los totales de los artículos y creo que de la forma que explique, se esta consiguiendo sin librerías o frameworks externos pero es funcional, fácil de implementar y ligero. Literalmente solo se hace una consulta a una tabla y ya.
Vos propones una solución compleja que no digo que este mal, pero quiero entender el por que es mejor. hasta ahora, veo algo complejo de integrar, que me da la misma solución.
Podrías hacer un video explicando por que es mejor a tu manera? Literalmente me interesa.
bueno video no creo.

entonces creo que ambos entendimos mal.

yo entendi que el usuario pide mostrar los post totales.

porque hacer un group por cada refresque de la pagina cuando puedes hacer con Eloquent o sistemas optimizados con cache y hacer la consulta cada 5 minutos, en total si son post no deberian cambiar en periodos muy cortos. y no es necesario tenerlo en tiempo real. incluso con cache a 30 minutos ira perfecto.

por otro lado. si necesitas restar o aumentar valores como sumar visitas es mas eficiente como lo indico.

si tienes 500 visitas por segundo, son 500 querys por segundo a la base de datos y la saturas. Puedes usar lo que he comentado para simplementar realizar un update cada 5 minutos y las sumas y restas manejarlas por DRC, Eloquent o cache y actualizar la base de datos cada x tiempo.

si necesitas es tiempo real. en vez de mostrar los resultados por la base de datos, solo debes mostrar lo guardado en la cache.
 

jmdoren

Delta
Verificación en dos pasos desactivada
Verificado por Whatsapp
Desde
31 May 2016
Mensajes
515
Hola!.
Tengo una web en la que tengo que contar cuantos artículos hay en cada sección:
Por ejemplo:

Artículos A (aquí mostrar cantidad).
Artículos B (aquí mostrar cantidad).
Artículos C (aquí mostrar cantidad).
Artículos D (aquí mostrar cantidad).

El problema es que tengo 28, y no creo que lo mas conveniente sea relizar 28 consultas, y mas teniendo en cuenta que es una web con bastante tráfico.

¿Hay alguna manera de optimizar esto?.
No es una pregunta de php, es más bien de base de datos, pero te puede servir este artículo para hacer una sola consulta
 

osqar

Gamma
Programador
Verificación en dos pasos desactivada
Desde
10 Nov 2015
Mensajes
184
Por medio de un group by, por ejemplo:

Insertar CODE, HTML o PHP:
SELECT s.nombre, count(1) FROM  articulos a INNER JOIN secciones s
oN a.id_seccion=s.id GROUP BY s.nombre
Eso te muestra el nombre de secciones y la cantidad de articulos por cada una, por supuesto que asumo muchas cosas pero no tengo el nombre de las tablas.
 

Arriba