2013-11-15 10 views
6

Sto lavorando con un'applicazione che utilizza phpActiveRecord e mySQL per estrarre i dati da una rete di sensori e tracciarli su un numero di grafici flot.js sul client.Restituzione di una seconda riga di una query SQL

Ci sono diversi intervalli di tempo in cui l'utente può scegliere di influenzare l'intervallo di dati visualizzati dai grafici. 2hrs, 24hrs, 3 days and 1 week.

I sensori vengono inviati al database ogni 60 secondi, quindi quando si tracciano i grafici, la query recupera tutte le righe tra now and DATE_SUB(CUR_DATE - INTERVAL ? DAY) dove? è 1, 3 o 7, ecc.

Tuttavia, questo risulta in un numero elevato di righe restituite (60,000 + for the full week!) e causa enormi ritardi e errori del server.

So che posso aumentare in modo massiccio la memoria massima disponibile per le query nel file php.ini, ma questa non è certo una buona soluzione e non risolve il problema della velocità.

La mia domanda è, c'è un modo per selezionare facilmente solo ogni seconda o terza riga dell'intervallo di date richiesto in base alla lunghezza dell'intervallo che l'utente desidera visualizzare?

In C o Java vorrei fare qualcosa come un modulo select per restituire righe alternate ma non riesco a pensare a un modo per farlo nel framework corrente.

Qualsiasi idea sarebbe apprezzata. Grazie.

+3

http://stackoverflow.com/questions/858746/how-do-you-select-every-n-th-row-from-mysql –

+0

Grazie Josh, questi sono ottimi collegamenti, ma purtroppo il modo in cui l'app è strutturato e generato dinamicamente significa che l'uso delle variabili utente è essenzialmente fuori questione. Le query sono gestite dal framework di routing slim.js e non direttamente richiamate dalla pagina del browser. Lo apprezzo comunque! Grazie. – bisslad

+1

Se il tuo ID è incrementale puoi usare quello (aggiungi un "è strano" come o è multiplo di 4/8 e così via alla tua dichiarazione WHERE) Inoltre: hai preso in considerazione l'uso della cache per i tuoi querys?Anche se tu potessi semplicemente usare mysql_result_cache, aumenteresti molto la tua performance. –

risposta

0
<? 
$row = 1; 
WHILE QUERY { 
    if ($row % 2 == 0) { 
     echo "Yourstuff"; 
    } else { 
     //Nothing 
    } 
    $row++; 
} 
?> 

Questo dovrebbe aiutare a pensare a un non solution..maybe quello perfetto per voi, ma spero che aiuta ... Per ogni terzo uso $ row% 3 e così via ...

+1

È come portare a casa 60.000 caramelle dal mercato (Database) e poi dire no ho solo bisogno di ogni secondo e non il resto. Perché ottenerli dal mercato (database) in primo luogo? Perché non decidere proprio lì cosa portare a casa (in php) –

+0

Dovrò provare questo tipo di soluzione, credo. Speravo di non dover generare migliaia di query più piccole ma questo potrebbe essere l'unico modo per farlo. Testerà e accetto quando ricevo questo. – bisslad

+0

@Hanky ​​Panky: Questa non dovrebbe essere una soluzione completa ... ma solo una cosa che forse lo aiuta a prendere la strada giusta ... un'altra soluzione sarebbe quella di fare una query per ogni riga ... per questo tu Avremo bisogno di ID continui ... ma non so se una query per ogni riga da mettere fuori sarebbe più veloce ... –

0

Prova:

$i = 0; 
foreach($row as $data){ 
    if($i == 1){ 
    //Do whatever with your 2n record 
    $i++; 
    } 
    if($i > 1){$i = 0;} //Reset the counter 
} 
+3

Quindi, dove incrementate $ i;) – douwe

+0

Ha, ben individuato. Scusa, ho corretto la mia risposta – ggdx

+0

Per essere onesti, quando è in PHP hai già perso metà del problema. Sì, eviti di inviarlo al client, ma lo stai ancora recuperando dal disco sul database, trasferendolo attraverso la rete in PHP, memorizzandolo in memoria, ecc. Ecc. Questo è meglio di niente ma non è la soluzione corretta – Basic

0

Tornando ogni seconda fila anche non soluzione ideale. Puoi usare la cache.

Il modo più semplice è memorizzare nella cache il tuo tavolo su un altro tavolo. Configura periodicamente il cron job automatico.

datas 
datas_cache (Only Results) 

Se si desidera una soluzione più professionale è necessario memorizzare nella cache il risultato in file possono utilizzare JSON

0

Alla fine ho fatto finire riuscendo a selezionare le righe come sopra specificato.

Tuttavia questa non era una soluzione accettabile per il problema che stavo avendo così ho deciso di provare a generare il mio lato server grafici per cercare di evitare del tutto il problema. Sembra logico che la creazione di grafici con così tanti punti dati sia fatta sul server e basta spingere un'immagine lungo il filo verso una tela html5 o qualcosa del genere. Andando a provare pChart per questo. Grazie a tutti i soccorritori in ogni caso.

Problemi correlati