• User Newbie

    Paginazione dati senza LIMIT

    Ciao a tutti. Una domanda che mi perseguita.
    Come potete leggere dai dati mi servirebbe una paginazione di dati estratti tramite semplici select evitando come dice lo stesso titolo il limit sql.
    Per un semplice motivo; ho un applicazione che produce milioni di record...fino ad 80 milioni, e non posso permettermi di ricaricare la query ogni qualvolta cambio di pagina.
    E' vero che una select la devo fare ugualmente, è inevitabile...ma volevo estrarre tutti i dati in una sola volta e in qualche modo visualizzarmeli a tranche...c'è una funzione o qualcosa di adatto ?
    grazie mille


  • Super User

    Ciao, caricare 80M di righe al posto di ricaricare una query è un po' un controsenso anche perché sposti il problema dal mysql server al web server che deve essere ben carrozzato per riuscire a tenere in memoria 80M di record per ogni utente che accede a quella pagina.

    Tornando al tuo problema potresti velocizzare la query in questo modo, che si basa pero' sulla necessità che tutti i record abbiano un id numerico e che ci sia un ordinamento di qualche tipo, presupponendo anche che tra un query ed un altra i dati non cambino l'ordinamento. Il modo è semplice: al posto di utilizzare solo il limit tieni traccia dell'ultimo ID restituito dalla query precedente e modificando la query fai si che questo ID sia il punto di partenza per le ricerche successive.

    Per intenderci la prima volta la query sarà:

    SELECT id,* from MYTABLE ORDER BY XYZ LIMIT 0,20;

    La seconda volta al posto di :

    SELECT id,* from MYTABLE ORDER BY XYZ LIMIT 20,20;

    fai

    SELECT id,* from MYTABLE WHERE ID > IDLAST ORDER BY XYZ LIMIT 0,20;

    In questo modo il DB non si deve scorrere i primi 20 (o 40 o 60....) risultati per capire da quale partire per i valori nuovi da ritornarti, ma ti ritorna i primi 20 che trova.

    Ah, immagino che la paginazione sia sequenziale e non "a salto", altrimenti decade tutto quello che ho detto e l'unica è usare il limit da solo.

    M.