Maison  >  Article  >  base de données  >  Pourquoi ma requête COUNT(*) avec une clause WHERE est-elle lente dans MySQL ?

Pourquoi ma requête COUNT(*) avec une clause WHERE est-elle lente dans MySQL ?

DDD
DDDoriginal
2024-11-02 09:20:03586parcourir

Why is My COUNT(*) Query with a WHERE Clause Slow in MySQL?

Requête COUNT(*) lente dans MySQL avec la clause Where

Lorsque vous traitez des requêtes MySQL lentes impliquant COUNT(*), comprendre le sous-jacent facteurs sont primordiaux. Dans ce cas particulier, le long temps d'exécution n'est pas immédiatement apparent à partir de la requête elle-même ou de l'instruction EXPLAIN.

Comprendre le problème

La table en question, change_event, a une clé primaire clusterisée sur la colonne change_event_id. Dans InnoDB, les clés primaires clusterisées sont stockées à côté des données dans les pages de données, contrairement aux index non clusterisés qui résident dans des pages d'index distinctes.

Le problème des analyses de plage sur les clés primaires clusterisées

La requête présentée effectue une analyse de plage sur la clé primaire clusterisée, où elle doit analyser une partie importante de la table. Cela peut prendre du temps, car les pages de données peuvent ne pas être physiquement stockées dans un ordre trié, ce qui entraîne des opérations d'E/S supplémentaires.

Solutions potentielles

Pour optimiser cela requête, envisagez de mettre en œuvre l'une ou les deux stratégies suivantes :

  1. Optimiser la table : L'exécution d'OPTIMIZE TABLE reconstruit les pages de données de la table, en garantissant qu'elles sont triées par la clé primaire, qui pourrait potentiellement accélérer l'analyse de la plage.
  2. Créer un index supplémentaire : L'ajout d'un index non principal uniquement sur la colonne change_event_id permettrait à MySQL d'analyser rapidement les pages d'index au lieu des pages de données. Cela pourrait améliorer considérablement les performances.

Remarque supplémentaire :

Envisagez de modifier la colonne change_event_id pour qu'elle soit BIGINT UNSIGNED s'il s'agit effectivement d'une colonne à incrémentation automatique. en partant de zéro. Cela éviterait des problèmes potentiels de débordement d'entier signé.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn