Mysql
 sql >> Datenbank >  >> RDS >> Mysql

60 Millionen Einträge, ausgewählte Einträge aus einem bestimmten Monat. Wie optimiert man die Datenbank?

Um Einträge in einem bestimmten Monat, für ein bestimmtes Jahr schneller zu erhalten, werden Sie müssen die time indizieren Spalte :

CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;

Verwenden Sie außerdem:

SELECT e.* 
  FROM ENTRIES e
 WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)

... weil BETWEEN inklusive ist, sodass Sie alles mit dem Datum "2010-05-01 00:00:00" mit der von Ihnen geposteten Abfrage erhalten würden.

Ich möchte auch Daten aus einem bestimmten Monat aus einer bestimmten DataSourceID auswählen

Sie können entweder einen separaten Index für die datasourceid-Spalte hinzufügen:

CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;

...oder richten Sie einen abdeckenden Index ein, der beide Spalten enthält:

CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;

Ein abdeckender Index erfordert, dass die Spalten ganz links in der Abfrage verwendet werden müssen, damit der Index verwendet werden kann. In diesem Beispiel mit time first funktioniert für beide Situationen, die Sie erwähnt haben - datasourceid muss nicht verwendet werden, damit der Index von Nutzen ist. Aber Sie müssen Ihre Abfragen testen, indem Sie sich die EXPLAIN-Ausgabe ansehen, um wirklich zu wissen, was für Ihre Daten und die Abfragen, die für diese Daten ausgeführt werden, am besten funktioniert.

Allerdings verlangsamen Indizes INSERT-, UPDATE- und DELETE-Anweisungen. Und ein Index bietet nicht viel Wert, wenn die Spaltendaten nur wenige eindeutige Werte haben - IE:Eine boolesche Spalte ist eine schlechte Wahl für den Index, da die Kardinalität niedrig ist.