Est-ce une bonne idée d'indexer le champ datetime dans mysql?

je travaille sur la conception d'une grande base de données. Dans mon application j'aurai beaucoup de lignes par exemple j'ai actuellement une table avec 4 millions d'enregistrements. La plupart de mes requêtes utilisent la clause datetime pour sélectionner les données. Est-ce une bonne idée d'indexer les champs datetime dans la base de données mysql?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

j'essaie de garder ma base de données fonctionne bien et les requêtes en cours d'exécution en douceur

Plus, quelle idée pensez - vous que je devrais avoir pour créer une haute efficacité base de données?

90
demandé sur SQB 2013-03-15 09:14:00

2 réponses

MySQL recommande d'utiliser les index pour diverses raisons, y compris l'élimination des lignes entre les conditions: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Cela fait de votre colonne datetime un excellent candidat pour un index si vous allez l'utiliser dans des conditions fréquentes dans les requêtes. Si votre seule condition est BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) et vous n'avez aucun autre index dans la condition, MySQL devra faire un complet table scan sur chaque requête. Je ne sais pas combien de lignes sont générées en 30 jours, mais tant qu'il est moins de 1/3 du total des lignes, il sera plus efficace d'utiliser un index sur la colonne.

votre question sur la création d'une base de données efficace est très large. Je dirais juste pour s'assurer qu'il est normalisé et toutes les colonnes appropriées sont indexées (c.-à-d. ceux utilisés dans les jointures et où les clauses).

113
répondu Explosion Pills 2013-03-15 05:22:06

ici l'auteur a effectué des tests ont montré que le timestamp unix entier est meilleur que le DateTime. Note, il a utilisé MySql. Mais je pense que peu importe quel moteur de DB que vous utilisez en comparant les entiers sont légèrement plus rapide que la comparaison des dates, donc l'indice int est meilleur que L'indice DateTime. Prendre T1-temps de comparer 2 dates, T2-temps de comparer 2 entiers. La recherche sur un champ indexé prend environ O(log (rows)) temps parce que l'index basé sur un arbre équilibré - il peut être différent pour différents moteurs DB, mais de toute façon Log(lignes) est une estimation courante. (si vous n'utilisez pas l'index bitmask ou R-tree). Donc la différence est (T2-T1) * Log(rows) - peut jouer un rôle si vous effectuez votre requête souvent.

11
répondu Baurzhan 2017-05-23 12:26:37