Elle améliore la performance de l'indice une colonne de date?
J'ai une table avec des millions de lignes où l'une des colonnes est un TIMESTAMP et contre qui j'ai souvent de sélectionner des plages de dates. Serait-il améliorer les performances tout à l'indice de la colonne, ou ne serait-ce pas la finition d'amélioration notable?
EDIT:
Donc, j'ai indexé de la colonne TIMESTAMP. La requête suivante
select count(*) from interactions where date(interaction_time) between date('2013-10-10') and date(now())
Prend 3,1 secondes.
Il y a un peu plus de 3 millions de disques dans les interactions de la table.
La requête ci-dessus produit un résultat de l' ~976k
Cela vous semble comme une quantité raisonnable de temps pour effectuer cette tâche?
Désolé, cette question est hors-sujet car il ne va pas aider les futurs visiteurs. Questions nécessitent au moins votre définition de la table, de requêtes et d'expliquer consolidés. C'est quelque chose qui peut vraiment être testé sur votre propre.
pourquoi -1? Semble parfaitement légitime question pour moi (en fait, j'ai trouvé une question très semblable qui a +de 3 votes, il n'a tout simplement pas répondre à mes question spécifique exactement comme j'en ai besoin d'une réponse).
Des questions hypothétiques telles que "est-ce à sembler comme une quantité raisonnable de temps pour effectuer cette tâche?" hors-sujet. Consultez le centre d'aide.
Il n'y a pas de "délai raisonnable" sans le savoir à vos hardaware (CPU, RAM, disques durs, etc.) et votre taille de données (100 lignes ou 100 milliards de lignes?) De sorte que la pièce est vraiment irréfutable que FreshPrince points. L'autre partie, sur l'existence d'un indice peut aider, peut être (somewaht) ont répondu.
OriginalL'auteur Genia S. | 2014-01-05
Vous devez vous connecter pour publier un commentaire.
Si vous voulez une amélioration de l'efficacité des requêtes, vous avez besoin de 2 choses:
Tout d'abord, l'indice de la colonne.
Deuxièmement, et c'est le plus important, assurez-vous que les conditions sur vos requêtes sont sargable, c'est à dire que les index peuvent être utilisés. En particulier, les fonctions ne doivent pas être utilisés sur les colonnes. Dans votre exemple, une façon d'écrire la condition serait:
S.: combien de lignes (en valeur absolue et en pourcentage) sont-ils sélectionnés? 1.5 secondes est BEAUCOUP. Fullscan vs indexé requête ne devrait pas différer par juste 2x, il a probablement été causée par un cache.
le résultat a été un peu moins d'un 1/3 du total des lignes de la table. J'ai répertorié les interaction_time colonne et couru votre requête imprimé. Juste changé la date pour vérifier qu'il n'était pas mis en cache et il semble que il peut avoir été
S.: fournir
EXPLAIN
pour la requêteexpliquer: 1 SIMPLE interactions gamme interaction_time_index interaction_time_index 5 NULS 1531970 à l'Aide, à l'Aide de l'indice de
OriginalL'auteur ypercubeᵀᴹ
Cela permettrait d'améliorer les performances si:
De s'en assurer, l'utilisation
EXPLIQUER
pour montrer ce que l'index est utilisé. Utilisez expliquer avant la création de l'index et de nouveau après vous devriez voir que le nouvel indice est utilisé ou non. Si son utilisation, vous pouvez être sûr, meilleure est la performance.Vous pouvez également comparer simplement les timings de la requête.
OriginalL'auteur Bohemian
La règle générale avec des indices est qu'ils la vitesse de récupération de données avec de grands ensembles de données, mais la LENTEUR de l'insertion et de mise à jour des registres.
Si vous avez des millions de lignes, et la nécessité de sélectionner un petit sous-ensemble d'entre eux, un index plus probable sera d'améliorer les performances lorsque vous effectuez une sélection. (Si vous avez besoin de la plupart ou de tous, s'il y aura peu ou pas de différence.)
Sans index, une analyse de la table (c'est à dire lecture de tous les enregistrements de localiser demandées) se produira, ce qui peut être lent.
Avec les tableaux avec seulement quelques enregistrements, une analyse de la table peut effectivement être plus rapide qu'un indice, mais ce n'est pas votre situation.
Une autre considération est le nombre de valeurs discrètes que vous avez. Si vous avez seulement une poignée de dates différentes, l'indexation ne sera probablement pas aider beaucoup si, toutefois, si vous avez un large éventail de dates de l'indice sera plus susceptible de vous aider.
Une mise en garde, si l'index est très grand et ne rentre pas dans la mémoire, vous ne pouvez pas obtenir les avantages de performance à laquelle vous vous attendiez.
Aussi vous devez tenir compte de ce que les autres champs que vous récupérez, joint, etc, car ils ont tous un impact.
Une bonne façon de vérifier la façon dont la performance est affectée est d'utiliser la clause de voir comment mySQL va exécuter la requête.
OriginalL'auteur vkiwi
Pour
requête à être optimisé, vous devez effectuer les opérations suivantes:
interaction_time
au lieu dedate(interaction_time)
interaction_time
colonne'2013-10-10'
pasdate('2013-10-10')
Vous devez #1 parce que les index ne sont utilisés que si les colonnes sont utilisées dans les comparaisons, non pas comme des arguments dans l'autre des expressions.
OriginalL'auteur zerkms
L'ajout d'un index sur la colonne de la date certainement augmente les performances.
Mon tableau a 11 millions de lignes, et une requête pour récupérer les lignes qui ont été mis à jour à une date précise, a pris le temps selon les conditions:
Sans index: ~2,5 s
Avec index: ~5ms
OriginalL'auteur vkrishna17