12
votes

MySQL - Complexité de: Sélectionnez Count (*) de MyTable;

Quelle est la complexité de cette requête MySQL xxx

est le nombre de nombres d'entrées dans une table stockée quelque part et mis à jour chaque fois qu'une ligne est insérée ou supprimée? Si tel est le cas, la complexité devrait être O (1).


1 commentaires

Il semble que cela devrait être O (n) au moment où vous cliquez sur un déclaration, faites donc attention à évaluer cela.


3 Réponses :


10
votes

Cela dépend du moteur de stockage.

  • Pour MyISAM, le nombre total de lignes est stocké pour chaque table afin que SELECT compte (*) à partir de votre carte est une opération O (1). Il suffit de lire cette valeur.
  • Pour Innodb, le nombre total de lignes n'est pas stocké, une analyse complète est donc requise. Ceci est une opération O (n).

    du manuel :

    innodb ne conserve pas un nombre interne de lignes dans une table. (En pratique, cela serait quelque peu compliqué en raison de la version multi-versionnage.) Pour traiter un Compte (*) de T Déclaration, innoDB doit numériser un index du tableau , qui prend un certain temps si l'index n'est pas entièrement dans la piscine tampon. Si votre table ne change pas souvent, l'utilisation du cache de requête MySQL est une bonne solution. Pour obtenir un compte rapide, vous devez utiliser une table de comptoir que vous créez vous-même et laisser votre application le mettre à jour en fonction des inserts et la supprime. Afficher l'état de la table peut également être utilisé si un nombre de lignes approximatives est suffisant. Voir la section 13.2.13.1, " innoDB Conseils de syntonisation de la performance ".


1 commentaires

J'ai une question. Si par complexité, nous voulons dire que le nombre de lectures de disque sera-t-il toujours O (n) pour analyser l'index de la table? Cela ne dépend pas du type d'index?



1
votes

AFAIK dans Myisam Rows-Count est mis en cache, à Innodb non, et à chaque compte - tout ce qu'il compte toutes les lignes.


0 commentaires

-5
votes

Je ne sais pas si cette valeur est stockée ou non, mais ce n'est pas important pour votre requête. Utilisation de MySQL avec votre requête, il comptera toutes les lignes retournées au moment où vous l'exécutez.


2 commentaires

Important ou non, c'est sa décision, n'est-ce pas? Cela semble une question parfaitement valide pour moi.


Il est très important de connaître la complexité des fonctions, en particulier pour éviter de longues requêtes une performance plus intelligente lorsque vous avez une grande quantité de données.