0
votes

Besoin d'une requête efficace SQL

J'ai environ 6 millions de rangées dans la table et je dois interroger la table avec une requête inférieure. XXX

J'ai créé Index pour fb_ads_account_id, créé_at, source_atext. ID est la clé primaire.

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?

y a-t-il d'autre moyen de créer cette requête plus Efficace?

Voici MySQL Expliquer la commande Explication

Entrez la description de l'image ici


1 commentaires

Il n'est pas clair quel index vous avez; Veuillez fournir show créer une table .


4 Réponses :


1
votes

Cette requête peut probablement être effectuée sans aucune sous-requête contre la même table, à savoir:

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

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é.


1 commentaires

Merci. Le groupe doit être là car il y a plusieurs rangées avec la même source afin de pouvoir obtenir le dernier.



1
votes

Je pense que l'index est exactement ce dont vous avez besoin. La partie dans le explique 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.

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)

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 Flush Table dans HTTPS: //dzone.com/articles/updating-innodb-table-statistics-Mantualement Mais il semble également venir avec des inconvénients aussi, utiliser avec soin)


1 commentaires

Merci beaucoup pour votre réponse. Cela m'a beaucoup aidé



1
votes

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'
               );


4 commentaires

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 . 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?



0
votes
INDEX(account_id, source_text, created_at)  -- in this order

0 commentaires