Heim  >  Artikel  >  Datenbank  >  Verwendung von count() in einer großen MySQL-Tabelle und Optimierung von count() in MySQL

Verwendung von count() in einer großen MySQL-Tabelle und Optimierung von count() in MySQL

不言
不言Original
2018-08-22 09:35:203937Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Verwendung von count() in großen MySQL-Tabellen und der Optimierung von count() in MySQL. Ich hoffe, dass er hilfreich ist dir geholfen.

Eine einzelne Tabelle enthält mehr als 60 Millionen Daten, aber Sie können sie nicht aufteilen. Sie müssen separat zählen, wie viele Daten sich in der Tabelle befinden, wie viele Produkte A und wie viele Produkte B haben

Vor der Optimierung ist die Tabellenstruktur wie folgt: Um den Inhalt auszublenden, habe ich die entsprechenden Felder unscharf gemacht.

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;

Dies ist eine reguläre InnoDB-Tabelle, daher wird ihre Anzahl(*) mit der von MyISAM verglichen Die Effizienz ist viel langsamer. Die Anzahl der von InnoDB angezeigten Zeilen ist nicht sehr genau, daher sind mehrere Strategien erforderlich 1539,499 s


count(1) benötigt 907,581s

count(A) Zählt den Index.

count(test6) Zählt den Primärschlüssel.

Da diese Tabelle nicht gut optimiert ist, dauert ausnahmslos jeder der oben genannten Schritte Tausende von Sekunden, was für uns unerträglich ist.

Jetzt beginnen wir mit der Analyse und Behebung dieses Problems.

Es wird erwartet, dass die Anzahl(*) der gesamten Tabelle innerhalb von 200 Sekunden normal, innerhalb von 100 gut und innerhalb von 50 ausgezeichnet sein sollte.

Zuerst habe ich test6 daraus extrahiert und eine separate Tabelle erstellt. Führen Sie den Vorgang aus.

Insgesamt 61.500.000 Daten

Count(*) dauert 10,238 Sekunden


Count(1) dauert 8,710 Sekunden

Count(test6) an Die Primärschlüsselanzahl beträgt 12,957 Sekunden.

Davon ist

am effizientesten und um

52,0 %

schneller als die langsamste > bestimmt die Felder, die Sie auf den optimalen Wert ändern können, zum Beispiel:

count(1)varchar ist mehr char. Obwohl varchar die Größe des Speicherplatzes automatisch zuweisen kann, muss .varchar 1 bis 2 zusätzliche Bytes zum Aufzeichnen verwenden Erhöhen Sie die Länge der Zeichenfolge und erhöhen Sie die Aktualisierungsvorgangszeit. count(pk)Datum/Uhrzeit wird in Zeitstempel geändert. Letzterer liegt zwischen 1978 und 2038.

Der letzte Test mit count(1) dauert am schnellsten , 168s. Obwohl es etwas langsam ist.

Zusammenfassung:

Verwenden Sie nicht blindlings zu viele Varchar-Werte.

Verwenden Sie count(1) anstelle von count(*) zum Abrufen.

Verwandte Empfehlungen:

Code-Implementierung der Infinitus-Klassifizierung in MySQL

Mysql-Datenbank Zusammenfassung der Optimierungsmethoden (muss gelesen werden)

Das obige ist der detaillierte Inhalt vonVerwendung von count() in einer großen MySQL-Tabelle und Optimierung von count() in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn