Maison  >  Article  >  base de données  >  Utilisation de count() dans une grande table mysql et optimisation de count() dans mysql

Utilisation de count() dans une grande table mysql et optimisation de count() dans mysql

不言
不言original
2018-08-22 09:35:203937parcourir

Le contenu que cet article vous apporte concerne l'utilisation de count() dans les grandes tables MySQL et l'optimisation de count() dans MySQL. Il a une certaine valeur de référence. J'espère que les amis dans le besoin pourront s'y référer. être utile pour vous aidé.

Une seule table contient plus de 60 millions de données, mais vous ne pouvez pas la diviser. Vous devez compter séparément la quantité de données contenues dans la table, le nombre de produits A et le nombre de produits B

.

Avant l'optimisation, la structure de la table est la suivante. Afin de masquer le contenu, j'ai flouté les champs correspondants

CREATE TABLE `xxxx` (
  `link` varchar(200) DEFAULT NULL,
  `test0` varchar(500) DEFAULT NULL,
  `test1` varchar(50) DEFAULT NULL,
  `test2` int(11) DEFAULT NULL,
  `test3` varchar(20) DEFAULT NULL,
  `test4` varchar(50) DEFAULT NULL,
  `test5` varchar(50) NOT NULL,
  `inserttime` datetime DEFAULT NULL,
  `test6` bit(1) NOT NULL DEFAULT b'0',
  `A` bit(1) NOT NULL DEFAULT b'0',
  `B` bit(1) NOT NULL DEFAULT b'0' ,
  PRIMARY KEY (`test5`),
  KEY `test6` (`test6`) USING BTREE,
  KEY `A` (`A`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Il s'agit d'une table InnoDB classique, donc son nombre (*) est comparé. à L'efficacité de MyISAM est beaucoup plus lente et le nombre de lignes affichées par InnoDB n'est pas très précis, je dois donc le compter ici. Il existe plusieurs stratégies
Un total de 61 500 000 données

compte. (*) consommation Temps 1539,499s

count(1) Prend du temps 907,581s

count(A) Compte l'index.

count(test6) Compte la clé primaire.

Sans exception, comme ce tableau n'est pas bien optimisé, chacun des éléments ci-dessus prendra des milliers de secondes, ce qui nous est intolérable.

Nous allons maintenant commencer à analyser et à résoudre ce problème .

On s'attend à ce que le nombre (*) de la table entière soit normal dans les 200 secondes, bon dans les 100 et excellent dans les 50.

Tout d'abord, j'en ai extrait test6 et formé une table séparée. Faites-le fonctionner
Un total de 61 500 000 données

count(*) prend 10,238s

count(1) prend 8,710s

count. (test6) Droite Le décompte de la clé primaire prend 12,957 s

parmi lesquels count(1) est le plus efficace, et est plus rapide que le plus lent count(pk) de 52,0%

<.> veillera à modifier le champ à la valeur optimale, par exemple :

varchar est plus char Bien que varchar puisse allouer automatiquement la taille de l'espace de stockage, .varchar doit utiliser 1 à 2 octets supplémentaires pour. enregistrez la longueur de la chaîne. Augmentez le temps de fonctionnement de sa mise à jour

Changez datetime en timestamp Ce dernier est entre 1978-2038

Le test final utilisant count(1) est le plus rapide. time, 168s. Bien qu'un peu lent mais acceptable

Résumé :

Redessinez les champs de votre table et essayez d'optimiser sa longueur. N'utilisez pas aveuglément trop de varchar.

Utilisez count (1) Au lieu de count(*) pour récupérer.

Recommandations associées :

Implémentation du code de la classification Infinitus dans MySQL

Résumé des méthodes d'optimisation des bases de données Mysql (à lire absolument)


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