2016-07-02 12 views
0

Ich benutze PHP und MYSQL (innodb engine).Beste Methode, um am meisten angesehene Beiträge aus den letzten Stunden auszuwählen

Wie MYSQL-Referenz sagt, kann die Auswahl mit dem Vergleich einer Spalte und die Bestellung durch eine andere unseren berücksichtigten Index nicht verwenden.

Ich habe eine Tabelle mit dem Namen News.

Diese Tabelle enthält mindestens 1 Million Datensätze mit zwei wichtigen Spalten: time_added und number_of_views.

Ich muss am meisten angesehen Datensätze von letzten n Stunden auswählen. Was ist der beste Index dafür? Oder ist es möglich, diese Art von Abfragen sehr schnell für eine Tabelle mit Millionen von Datensätzen auszuführen?

Ich habe dies bereits für "letzten Tag" getan, was bedeutet, dass ich die am meisten angesehenen Datensätze vom letzten Tag auswählen kann, indem ich eine neue Spalte hinzufüge (date_added). Aber wenn ich mich entscheide, diese Aufzeichnungen der letzten Woche auszuwählen, bin ich wieder in Schwierigkeiten.

+0

Sie sollten die Abfrage angeben, die Sie in der Frage verwenden möchten. –

Antwort

1

Zuerst schreiben Sie die Abfrage:

select n.* 
from news n 
where time_added >= date_sub(now(), interval <n> hours) 
order by number_of_views desc 
limit ??; 

Der beste Index ist (time_added, number_of_views). Eigentlich wird number_of_views nicht für die vollständige Abfrage verwendet, aber ich würde es für andere mögliche Abfragen einschließen.

0

Zuerst müssen Sie die folgende Zeile in der my.cnf hinzufügen (in Abschnitt

[mysqld]): 
query_cache_size = 32M (or more). 
query_cache_limit = 32M (or more) 

query_cache_size Sets Größe des Cache

Eine weitere Möglichkeit, die Aufmerksamkeit zahlen sollte - diese query_cache_limit - Es legt die maximale Menge des Ergebnisses der Abfrage fest, die in den Cache gestellt werden kann Überprüfen Sie den Status des Cache, Sie können Folgendes anfordern:

show global status like 'Qcache%'; 

http://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html

Wenn die Tabelle einen mehrspaltigen Index hat, kann jeder ganz links Präfix des Indexes vom Optimierungsprogramm Reihen sehen verwendet werden. Wenn Sie beispielsweise einen dreispaltigen Index für (Spalte1, Spalte2, Spalte3) haben, haben Sie Suchfunktionen für (Spalte1), (Spalte1, Spalte2) und (Spalte1, Spalte2, Spalte3) indiziert. Weitere Informationen finden Sie unter http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html

+0

"Ansichten passieren häufig, richtig? Jedes Mal, wenn die Tabelle aktualisiert wird, werden _all_ Einträge im Query-Cache für diese Tabelle entfernt. Dies macht die QC für Ihre Aufgabe neben nutzlos. –

0

Sie benötigen eine Übersichtstabelle. Seit ‚Stunde‘ ist Ihre Granularität, so etwas wie dies funktionieren könnte:

CREATE TABLE HourlyViews (
    the_hour DATETIME NOT NULL, 
    ct SMALLINT UNSIGNED NOT NULL, 
    PRIMARY KEY(the_hour) 
) ENGINE=InnoDB; 

Es könnte eine weitere Spalte benötigen (und fügen Sie es dem PK), wenn es eine Aufschlüsselung der Artikel, die Sie zählen. Und Sie könnten einige andere Dinge SUMMEN oder ZÄHLEN in dieser Tabelle wollen.

Erstellen und verwalten Sie diese Tabelle inkrementell. Das heißt, jede Stunde, fügen Sie eine weitere Zeile in die Tabelle ein. (Oder man könnte es mit INSERT .. ON DUPLICATE KEY UPDATE .. dem Laufenden halten.)

More on Summary Tables

dann die Abfrage ändern, dass die Tabelle zu verwenden; es wird ein Los schneller sein.