Mysql
 sql >> Base de données >  >> RDS >> Mysql

60 millions d'entrées, sélectionnez les entrées d'un certain mois. Comment optimiser la base de données ?

Pour obtenir des entrées dans un mois particulier, pour une année particulière, plus rapidement - vous allez besoin d'indexer l'time colonne :

CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;

De plus, utilisez :

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

... parce que BETWEEN est inclusif, donc vous obtiendrez tout ce qui est daté "2010-05-01 00:00:00" avec la requête que vous avez postée.

J'aimerais également sélectionner les données d'un certain mois à partir d'un DataSourceID donné

Vous pouvez soit ajouter un index séparé pour la colonne datasourceid :

CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;

...ou configurez un index de couverture pour inclure les deux colonnes :

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

Un index de couverture nécessite que les colonnes les plus à gauche soient utilisées dans la requête pour que l'index soit utilisé. Dans cet exemple, avoir time first fonctionnera pour les deux situations que vous avez mentionnées - datasourceid n'a pas besoin d'être utilisé pour que l'index soit utile. Mais, vous devez tester vos requêtes en affichant la sortie EXPLAIN pour vraiment savoir ce qui fonctionne le mieux pour vos données et les requêtes effectuées sur ces données.

Cela dit, les index ralentiront les instructions INSERT, UPDATE et DELETE. Et un index ne fournit pas beaucoup de valeur si les données de la colonne ont peu de valeurs distinctes - IE :une colonne booléenne est un mauvais choix pour indexer, car la cardinalité est faible.