Pregunta

Tengo un conjunto de datos en MySQL donde usar limit ya es una consulta costosa, y encontrar el número de resultados también es costoso. Por lo tanto, me gustaría evitar hacer otra consulta para encontrar el número de resultados. No puedo usar MYSQL_CALC_FOUND_ROWS porque el límite está dentro de una subconsulta:

SELECT * FROM items,
(
  SELECT
    item_id
  FROM
    (etc)
  WHERE
    some.field=<parameter>
  AND (etc)
  GROUP BY (something)
  ORDER BY (something_else) DESC
  LIMIT 15
) subset
WHERE item.id=subset.item_id

Podría dejar unir elementos y eliminar la subconsulta, luego ser capaz de usar MYSQL_CALC_FOUND_ROWS, sin embargo, esto es muy, muy lento. He intentado todas las optimizaciones de índice y supongamos que está fuera de discusión.

Esto ahora se convierte más en una pregunta de diseño ... ¿cómo permito que el usuario navegue por estos datos cuando no conozco la última página ? Solo sé si han ido demasiado lejos (por ejemplo: la consulta no devuelve resultados).

¿Fue útil?

Solución

Aquí hay un resumen de un artículo del gurú de MySQL Baron Schwartz:

http: //www.mysqlperformanceblog .com / 2008/09/24 / cuatro formas de optimizar las pantallas paginadas /

Cuatro formas de optimizar las pantallas paginadas

  1. En la primera consulta, obtenga y guarde en caché todos los resultados.

  2. No muestra todos los resultados. Ni siquiera Google te permite ver el millonésimo resultado.

  3. No muestre el recuento total o los enlaces intermedios a otras páginas. Mostrar solo el " siguiente " enlace.

  4. Estima cuántos resultados hay. Nuevamente, Google hace esto y nadie se queja.

Otros consejos

Para reforzar eso, el concepto de "cuántos" es extremadamente transitorio de todos modos; para cuando la respuesta llegue al usuario, podría estar equivocada fácilmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top