J'ai une table de mots-clés que je rafraîchis régulièrement par rapport à une API de recherche à distance, et j'ai une autre table qui reçoit une rangée chaque fois que je rafraîchis l'un des mots-clés. J'utilise cette table pour empêcher plusieurs processus de se chevaucher et d'actualiser le même mot clé, ainsi que la collecte de statistiques. Donc, quand je lance mon programme, il interroge tous les mots-clés qui n'ont pas de demande en cours, et qui n'ont pas réussi dans les 15 dernières minutes, ou quel que soit l'intervalle. Tout fonctionnait bien pendant un certain temps, mais maintenant la table keywords_requests a près de 2 millions de lignes et les choses s'enlisent mal. J'ai des index sur presque chaque colonne dans la table keywords_requests, mais en vain.Comment optimiser la recherche de lignes où les lignes de jointures conditionnelles n'existent pas?
Je suis en train d'enregistrer des requêtes lentes et celle-ci prend une éternité, comme vous pouvez le voir. Que puis-je faire?
# Query_time: 20 Lock_time: 0 Rows_sent: 568 Rows_examined: 1826718 SELECT Keyword.id, Keyword.keyword FROM `keywords` as Keyword LEFT JOIN `keywords_requests` as KeywordsRequest ON ( KeywordsRequest.keyword_id = Keyword.id AND (KeywordsRequest.status = 'success' OR KeywordsRequest.status = 'active') AND KeywordsRequest.source_id = '29' AND KeywordsRequest.created > FROM_UNIXTIME(1234551323) ) WHERE KeywordsRequest.id IS NULL GROUP BY Keyword.id ORDER BY KeywordsRequest.created ASC;
Wow, merci pour votre aide. Le EXPLAIN pour cette requête n'a pas été très utile pour moi. Voici ce que j'ai obtenu après avoir supprimé les clauses GROUP BY et ORDER BY ... qu'est-ce que je cherche? http://img.skitch.com/20090213-fq5mkucasgdqc3ck9aeca6qr9p.jpg –
En outre, j'ai obtenu le plus d'amélioration de la vitesse en utilisant l'exemple de Quassnoi ci-dessous. Mais si je voulais accélérer les choses, un index multi-colonnes pourrait-il encore m'aider?Aurais-je juste besoin de source_id, status et keyword_id dans l'index, puisque created est dans une sous-requête? –
Difficile à deviner, car le choix des index de l'optimiseur dépend en partie de la distribution des valeurs de données dans votre base de données. Le meilleur conseil est de l'essayer de différentes façons et de mesurer à la fois les informations EXPLAIN ainsi que le temps réel pour exécuter la requête. –