J'ai environ 6 millions de rangées dans la table et je dois interroger la table avec une requête inférieure. J'ai créé Index pour fb_ads_account_id, créé_at, source_atext. ID est la clé primaire. P> Ma question est la raison pour laquelle cette requête prend environ 9 secondes pour obtenir le résultat même si j'ai créé des index? P> y a-t-il d'autre moyen de créer cette requête plus Efficace? P> Voici MySQL Expliquer la commande Explication forte> p>
4 Réponses :
Cette requête peut probablement être effectuée sans aucune sous-requête contre la même table, à savoir: p>
Si vous voulez l'ID max. Ou quelque chose de similaire, je ne suis pas sûr de besoin que vous avez besoin du groupe pour obtenir le résultat souhaité. P> Sélectionnez * à partir de fd_cpc_historical_data
Où fb_ads_account_id = 1462257067274960
Et créé entre '2019-12-13 00:00:00' et '2019-12-13 23:59:59'
Commande par ID DE LAMP LIMITE 1 CODE> P>
Merci. Le groupe doit être là car il y a plusieurs rangées avec la même source afin de pouvoir obtenir le dernier.
Je pense que l'index est exactement ce dont vous avez besoin. La partie dans le Pour être honnête, je ne suis pas très familier avec MySQL, mais dans MSSQL, je vais essayer de jeter d'abord les résultats de la sous-requête dans une table temporaire, placez un index cluster unique sur celui-ci, puis tout sélectionner à partir de La table d'origine jointe à ladite table temporaire sur la colonne ID. (N'utilisez pas d'utilisation, utilisez une jointure car il ne peut y avoir de double dans la table temporaire) p>
Cela pourrait également montrer où tout le temps est dépensé.
Je suppose que cela est principalement une question de statistiques, mais je ne sais pas vraiment comment forcer une mise à jour des statistiques sur l'indice de MySQL.
(Il y a quelques discussions sur explique code> qui me confond est la quantité de lignes (devintitimated?) De la sous-requête étant si différente de celle de la requête principale. p>
Flush Table Code> dans HTTPS: //dzone.com/articles/updating-innodb-table-statistics-Mantualement Mais il semble également venir avec des inconvénients aussi, utiliser avec soin) P>
Merci beaucoup pour votre réponse. Cela m'a beaucoup aidé
Ceci est votre requête:
SELECT hd.* FROM FD_CPC_HISTORICAL_DATA hd WHERE hd.fb_ads_account_id = 1462257067274960 AND hd.id = (SELECT MAX(hd2.id) FROM FD_CPC_HISTORICAL_DATA hd2 WHERE hd2.fb_ads_account_id = hd.hd.fb_ads_account_id AND hd2.source_text = hd.source_tx AND hd2.created_at >= '2019-12-13' AND hd2.created_at < '2019-12-14' );
Merci. Est-ce un index composite ou quelque chose comme ça? Je demande juste parce que je ne suis pas beaucoup de compétence sur les index :)
@Sandunpera. . . Un index avec plus d'une clé est appelé un indice composite i>. L'indice proposé est donc un indice composite.
Merci beaucoup. J'ai eu une amélioration dramatique avec cela.
@sandunpera. . . Vous avez accepté une autre réponse. Cela signifie-t-il que la réponse a fourni de meilleures performances?
INDEX(account_id, source_text, created_at) -- in this order
Il n'est pas clair quel index vous avez; Veuillez fournir
show créer une table code>.