Partiamo dal presupposto che l'estrazione dei dati da una base dati, soprattutto se questa deve servire un web server, deve essere il piu possibile efficiente. Questo vuol dire che devi implementare alcune procedure di "best effort", ovvero che ti garantiscano una resa migliore. Prima di tutte: evitare per quanto possibile il costrutto "select * ". non perchè questo sia sintatticamente scorretto, ma perche è terribilmente poco efficiente, puoi leggere ad esempio,
uno tra mille.
In pratica, mettendoti nel "worst case", quando i record aumenteranno, le performance degraderanno sempre di piu.
L'idea qui è di realizzare una piccola UDF (user defined function) tipica di MySQL, oppure usare una delle funzioni già integrate nel linguaggio per convertire le tue date in epoch. In questo modo, le date non saranno altro che una stringa numerica, e la selezione sulle stringhe numeriche è estremamente piu veloce ed affidabile, rispetto ai filtri sulle stringhe.
Oltre a questo, visto che già sai che le tue procedure saranno interessate ad uno specifico estratto dei dati, puoi prevedere di implementare già da subito una tabella che sia partizionata (PARTIOTIONED BY) e poi specificare il campo di partizionamento, nel tuo caso, la marcatura temporale. Puoi in alternativa prevedere la creazione di una view già ordinata sui campi che ti interessano, e poi la potrai materializzare solo in caso di necessità.
Considera inoltre che nelle tue query hai usato i costrutti che sono, in assoluto i piu "impegnativi" in termini di risorse. Ad esempio la "order by", per giunta su campi combinati, rischia di rallentare l'intero sito. Consiglio a questo punto, di sviluppare tabelle distinte, estrarre i campi da diverse tabelle e poi fare una "INNER LEFT JOIN" su campi che sono già stati filtrati dalle tabelle. Tendenzialmente vale il concetto che combinare (con join) campi già filtrati, provenienti da tabelle diverse e distinte, è piu efficiente che estrarre i medesimi dati da un'unica tabella generalista. Non dimenticare che l'engine del DB dovrà scorrere uno dopo l'altro ogni singolo record appartenente alla tabella, per completare.
Un ultimo appunto. La WHERE condition va applicata
PRIMA della clausola LIMIT. Questo perche, la where condition limita realmente il numero di campi letti, ovvero l'engine farà un fetch preliminare del record, se questo rispetta la where condition, allora viene aggiunto all'output, altrimenti viene ignorato. La Limit invece prende TUTTI i record, e poi visualizza semplicemente quelli specificati. E' quindi meglio usare prima la where perche alleggerisce e rende molto piu veloce la query.
Il primo consiglio comunque, visto che hai ancora le tabelle (presumibilmente) quasi vuote, è di sviluppare la funzione per convertire le date in epoch, oppure di cercare la funzione già fatta su mysql stesso. Poi potrai ottimizzare tabelle e query.