J'ai une requête comme ci-dessous: et j'ai 2 index sur keyword_report; p> expliquer le format = JSON Résultat: p> dans le tableau, il y a environ; p> Je ne pouvais pas comprendre deux choses ici. p> Pourquoi est-ce qu'il utilise temporaire? p> li>
Pourquoi les index multiples ne fonctionnent pas? P> LI>
ol> En conséquence, comment puis-je l'améliorer? P> P>
3 Réponses :
La sortie JSON suivante semble indiquer que votre indice code> index1 code> est utilisé: Cet index peut être utilisé pendant le Pour donner un exemple dans lequel vous pourriez utiliser un seul index pour couvrir toutes les étapes de la requête, considérez les éléments suivants: p> Maintenant, si vous avez défini l'index suivant: p> alors mySQL pourrait choisir de l'utiliser. Cela fonctionnerait car, après filtration des enregistrements de désactivation dans la clause où CODE> CLAUSE Pour filtrer les enregistrements non correspondants. Après cela, MySQL doit toujours effectuer un groupe code> d'agrégation code>, qui inclut une somme sur la colonne code> impressions code>. Notez qu'un index n'entraidera pas vraiment beaucoup pour l'agrégation, car, par définition, la base de données doit toucher chaque enregistrement, dans chaque groupe, pour calculer la somme. Bien que la plupart du temps, une base de données ne choisira même pas d'utiliser deux indices différents sur la même table (mais cela est possible), dans ce cas, le second
index2 code> indexé ne vous aiderait pas beaucoup ici à cause de la Nature de votre agrégation. p>
où code>, il serait facile de trouver la valeur max de
impressions code> pour chaque pays. P> P >
MySQL s'arrêtera à reporting_date code> Condition de gamme de rencontres Malheureusement i>. Ainsi, la suggestion d'index ne fonctionnera pas.
reporter_date est une plage, alors après rapport_date, votre index (org_id, rapport_date, pays, impressions) ne fonctionne pas?
@Sha je suggère cet index pour une requête différente, pas celle que vous avez présentée dans votre question. Pour ce que vous avez présenté, index1 code> pourrait être aussi bon que possible.
Pourquoi plusieurs index ne fonctionnent pas? P> blockQuote>
mysql utilise rarement plus d'un index à la fois, sauf s'il y a une possibilité de
index_merge code>, lors de l'utilisation de
ou code> conditions, etc. Dans ce cas particulier, la première priorité est Pour
où code> condition, c'est pourquoi il utilise le
index1 code> car il peut réduire les recherches de données par PIN-pointage sur des lignes spécifiques à regarder en utilisant l'index. Aussi, logiquement,
où code> se produit avant
groupe par code>, et il aide également à réduire les données à l'agrégat sur (au lieu de traverser la table complète). P>
En outre, aucune autre suggestion d'index ne fonctionnerait car mysql s'arrêtera à
reporting_date code> Condition de plage malheureusement em>. p>.
Pourquoi est-ce qu'il utilise temporaire? p> blockQuote>
car, vous utilisez
groupe par code> - la requête va d'abord aller chercher toutes les données dans une table temporaire (également votre index ne couvre pas) et une fois ce processus effectué, il effectuera le Agrégation en conséquence. P>
Il est également expliqué dans la documentation MySQL : p>
Utilisation de temporaire (propriété JSON: utilisation_temporary_table) p>
Pour résoudre la requête, MySQL doit créer une table temporaire pour tenir le résultat. Cela se produit généralement si la requête contient du groupe par et Ordre par des clauses qui répertorient les colonnes différemment. P> blockQuote>
Pour cette requête:
select ck.*, (select sum(impressions) from keyword_report r2 where r2.country = r.country and r2.keyword_id = r.keyword_id and r2.report_date = r.report_date ) as total_impressions from (select distinct country, keyword_id from keyword_report r where r.org_id = 1 and r.report_date = '2019-09-10' ) ck;
Gordon, Report_Date devrait être de la gamme. S'il vous plaît vérifier à nouveau.
"Comment puis-je l'améliorer?" - Que voulez-vous améliorer? Est-ce trop lent pour vous? Combien de lignes correspondent à l'endroit où les conditions? Et combien de lignes obtenez-vous après le groupe?