Maison  >  Article  >  base de données  >  Que dois-je faire si la requête de comptage MySQL est très lente ? solution d'optimisation de la vitesse des requêtes MySQL

Que dois-je faire si la requête de comptage MySQL est très lente ? solution d'optimisation de la vitesse des requêtes MySQL

php是最好的语言
php是最好的语言original
2018-08-04 17:00:0524307parcourir

La vitesse lente des requêtes MySQL est une chose très gênante. Par conséquent, l'auteur a passé du temps à trier le plan d'optimisation de la vitesse des requêtes MySQL. Cet article est entièrement écrit par l'auteur. questions ou erreurs, vous êtes invités à me communiquer et à me corriger. Nous pouvons apprendre et progresser ensemble.

Optimisation Count() des grandes tables MySQL

Tutoriels vidéo MySQL associés recommandés : "Tutoriel MySQL"

Cet article est également écrit car Cela peut vous aider à dissiper vos doutes et à revenir au sujet. Ce qui suit est mon jugement basé sur la structure des données de l'arbre B+ et les spéculations sur les résultats expérimentaux

Aujourd'hui, j'ai expérimenté avec MySQL. Optimisation du fonctionnement de count(), comme suit La discussion est basée sur le moteur de stockage mysql5.7 InnoDB x86.

La structure de la table créée est la suivante (la quantité de données est de 1 million) :
Que dois-je faire si la requête de comptage MySQL est très lente ? solution doptimisation de la vitesse des requêtes MySQL

Tout d'abord, à propos du count(*) de MySQL, count( PK), count(1 ) Lequel est le plus rapide ?
Les résultats de la mise en œuvre sont les suivants :
Que dois-je faire si la requête de comptage MySQL est très lente ? solution doptimisation de la vitesse des requêtes MySQL
Que dois-je faire si la requête de comptage MySQL est très lente ? solution doptimisation de la vitesse des requêtes MySQL
Que dois-je faire si la requête de comptage MySQL est très lente ? solution doptimisation de la vitesse des requêtes MySQL
Il n'y a aucune différence ! Après avoir ajouté la clause WHERE, les trois requêtes prennent le même temps, je ne posterai donc pas de photos.

J'ai écrit une select count(*) from table instruction SQL lorsque j'étais dans l'entreprise auparavant, et c'était très lent quand il y avait beaucoup de données. Alors comment optimiser ?

Cela commence par l'index d'InnoDB. L'index d'InnoDB est B+Tree.

Pour l'index de clé primaire : il stocke uniquement les données sur les nœuds feuilles, sa clé est la clé primaire et la valeur est l'intégralité des données .
Pour les index auxiliaires : key est la colonne à indexer et value est la clé primaire.

Cela nous donne deux informations :
1. Les données entières seront trouvées en fonction de la clé primaire
2. Seule la clé primaire pourra être trouvée en fonction de l'index auxiliaire, et ensuite. les informations restantes doivent être trouvées via la clé primaire.

Donc, si nous voulons optimiser l'opération count(*), nous devons trouver une colonne short et créer un index auxiliaire pour celle-ci.
Dans mon exemple, c'est status, bien que sa « gravité » soit proche de 0.

Créez d'abord un index : ALTER TABLE test1 ADD INDEX (status);
puis interrogez, comme indiqué ci-dessous :
Que dois-je faire si la requête de comptage MySQL est très lente ? solution doptimisation de la vitesse des requêtes MySQL
Comme vous pouvez le constater, le temps de requête est passé de 3,35 s à 0,26 s et la vitesse de requête a augmenté de près de 13 fois.

Si l'index est la colonne str, quel sera le résultat ?
Créez d'abord un index : alter table test1 add index (str)
Les résultats sont les suivants :
Que dois-je faire si la requête de comptage MySQL est très lente ? solution doptimisation de la vitesse des requêtes MySQL

Comme vous pouvez le voir, le temps est de 0,422 s, ce qui est également très rapide, mais par rapport à la colonne status Il y a un écart d'environ 1,5 fois.

Pour faire une expérience plus audacieuse, j'ai supprimé l'index de la colonne status, créé un index conjoint de status et left(omdb,200) (cette colonne a en moyenne 1000 caractères), puis j'ai regardé au moment de la requête.
Créer un index : alter table test1 add index (statut,omdb(200))
Les résultats sont les suivants :
Que dois-je faire si la requête de comptage MySQL est très lente ? solution doptimisation de la vitesse des requêtes MySQL
Le temps est de 1,172 s
alter table test1 add index (status,imdbid );

Supplémentaire ! !
Faites attention aux échecs d'index !
L'apparence normale une fois l'index établi :
Que dois-je faire si la requête de comptage MySQL est très lente ? solution doptimisation de la vitesse des requêtes MySQLVous pouvez voir que key_len vaut 6, la description d'Extra utilise index.

Et si l'index échoue :
Que dois-je faire si la requête de comptage MySQL est très lente ? solution doptimisation de la vitesse des requêtes MySQL

Il existe de nombreux cas d'échec d'index, tels que l'utilisation de fonctions, d'opérations !=, etc. Veuillez vous référer à la documentation officielle pour plus de détails.

Je n'ai pas de recherche approfondie sur MySQL. Ce qui précède est basé sur mon jugement basé sur la structure des données de l'arbre B+ et sur les spéculations sur les résultats expérimentaux. S'il y a des lacunes, veuillez me corriger.

Articles connexes :

Sql server2005 Résumé de 50 façons d'optimiser la vitesse des requêtes

Améliorer la vitesse des requêtes : plan d'optimisation de la base de données SQL Server

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