Impaginazione di set di dati molto grandi
-
19-08-2019 - |
Domanda
Ho un set di dati in MySQL in cui l'utilizzo del limite è già una query costosa e anche trovare il numero di risultati è costoso. Quindi, vorrei evitare di fare un'altra query per trovare il numero di risultati. Non riesco a usare MYSQL_CALC_FOUND_ROWS perché il limite è all'interno di una sottoquery:
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
Potrei lasciare gli elementi di join e eliminare la subquery, quindi essere in grado di utilizzare MYSQL_CALC_FOUND_ROWS, tuttavia è molto, molto, molto lento. Ho provato tutte le ottimizzazioni dell'indice e supponiamo che sia fuori discussione.
Questo ora diventa più una domanda di progettazione ... come posso consentire all'utente di sfogliare questi dati quando non conosco l'ultima pagina ? So solo se sono andati troppo lontano (ad es. Query non restituisce risultati).
Soluzione
Ecco un riassunto di un articolo del guru di MySQL Baron Schwartz:
http: //www.mysqlperformanceblog .com / 2008/09/24 / quattro-vie-a-ottimizzare-impaginati-display /
Quattro modi per ottimizzare i display impaginati
-
Nella prima query, recupera e memorizza nella cache tutti i risultati.
-
Non mostra tutti i risultati. Nemmeno Google ti consente di vedere il milionesimo risultato.
-
Non mostra il conteggio totale o i collegamenti intermedi ad altre pagine. Mostra solo il "successivo" collegamento.
-
Stima quanti risultati ci sono. Ancora una volta, Google fa questo e nessuno si lamenta.
Altri suggerimenti
Per rinforzarlo, il concetto di "quanti" è comunque estremamente transitorio; quando la risposta arriva all'utente, potrebbe facilmente essere sbagliata.