web-dev-qa-db-fra.com

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, je n'ai actuellement qu'une table avec 4 millions d'enregistrements. La plupart de mes requêtes utilisent la clause datetime pour sélectionner des 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 maintenir le bon fonctionnement de ma base de données et le bon déroulement des requêtes

De plus, quelle idée devrais-je avoir pour créer une base de données à haute efficacité?

107
Jaylen

MySQL recommande d'utiliser les 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. Si votre seule condition est BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY) et que vous ne possédez aucun autre index, MySQL devra effectuer une analyse complète du tableau pour chaque requête. . Je ne sais pas combien de lignes sont générées en 30 jours, mais tant que cela représente moins d'un tiers 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 large. Je dirais simplement de s’assurer qu’il est normalisé et que toutes les colonnes appropriées sont indexées (c’est-à-dire celles utilisées dans les clauses jointures et where).

130
Explosion Pills

Ici L’auteur a effectué des tests qui ont montré que l’horodatage unix entier est meilleur que DateTime. Remarque, 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 int index est supérieur à DateTime. Prenez T1 - le temps de comparer 2 dates, T2 - le temps de comparer 2 entiers. La recherche sur un champ indexé prend environ O(log(rows)), car l'index est basé sur une arborescence équilibrée. Il peut être différent pour différents moteurs de base de données, mais Log (lignes) est une estimation courante. (si vous n'utilisez pas d'index à base de masque de bits ou d'arborescence). La différence est donc (T2-T1) * Journal (lignes) - peut jouer un rôle si vous exécutez votre requête souvent.

15
Baurzhan