193 votes

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

Je travaille à la conception d'une grande base de données. Dans mon application, j'aurai de nombreuses lignes. Par exemple, j'ai actuellement une table contenant 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 date dans une base de données mysql ?

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

J'essaie de faire en sorte que ma base de données fonctionne bien et que les requêtes soient exécutées sans problème.

En outre, quelle idée pensez-vous que je devrais avoir pour créer une base de données à haut rendement ?

216voto

Explosion Pills Points 89756

MySQL recommande l'utilisation d'index pour diverses raisons, notamment 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 comptez l'utiliser fréquemment dans des conditions dans des requêtes. Si votre seule condition est BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) et que vous n'avez pas d'autre index dans la condition, MySQL devra faire un balayage complet de la table sur chaque requête. Je ne suis pas sûr du nombre de lignes générées en 30 jours, mais tant que ce nombre est inférieur à environ 1/3 du nombre total de 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 vaste. Je dirais qu'il faut simplement s'assurer qu'elle est normalisée et que toutes les colonnes appropriées sont indexées (c'est-à-dire celles utilisées dans les jointures et les clauses where).

25voto

Baurzhan Points 2540

Ici Les tests effectués par l'auteur ont montré que l'integer unix timestamp est meilleur que DateTime. Notez qu'il a utilisé MySql. Mais je pense que quel que soit le moteur de base de données que vous utilisez, la comparaison des entiers est légèrement plus rapide que la comparaison des dates, donc l'index des entiers est meilleur que l'index des dates. Prenez T1 - temps de comparaison de 2 dates, T2 - temps de comparaison de 2 entiers. La recherche sur un champ indexé prend approximativement O(log(lignes)) de temps parce que l'index est basé sur un arbre équilibré - cela peut être différent pour différents moteurs de BD mais de toute façon Log(lignes) est une estimation commune. (si vous n'utilisez pas d'index basé sur un masque de bits ou un r-tree). Donc la différence est (T2-T1)*Log(rows) - peut jouer un rôle si vous effectuez votre requête souvent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X