2016-02-26 12 views
6

Zuerst möchte ich vergleichen count (*) und count (id), die eine bessere Leistung hat?warum mysql count (*) hat eine bessere Leistung als count (id)

mysql Version

5.6.21-1~dotdeb.1-log 

Tisch info

PRIMARY KEY (`id`), 
KEY `is_availability` (`is_availability`,`is_del`) 
ENGINE=InnoDB AUTO_INCREMENT=48993819 DEFAULT CHARSET=utf8 
  1. vergleichen, ohne in dem Zustand

    select count(*) from op_log; 
    +----------+ 
    | count(*) | 
    +----------+ 
    | 48989975 | 
    +----------+ 
    1 row in set (10.02 sec) 
    
    select count(id) from op_log ; 
    +-----------+ 
    | count(id) | 
    +-----------+ 
    | 48989990 | 
    +-----------+ 
    1 row in set (12.05 sec) 
    

count(*) besser als count(id)

  1. vergleichen mit dem Zustand

    select count(*) from op_log where is_availability=1; 
    +----------+ 
    | count(*) | 
    +----------+ 
    | 48990038 | 
    +----------+ 
    1 row in set (15.86 sec) 
    select count(id) from op_log where is_availability=1; 
    +-----------+ 
    | count(id) | 
    +-----------+ 
    | 48990096 | 
    +-----------+ 
    1 row in set (17.13 sec) 
    

    count(*) immer noch besser als count(id)

Also, wenn ich den Schluss ziehen kann, dass count(*) hat eine bessere Leistung als count(id) und warum ist das?

Von High Performance MySQL bekam ich

wenn mysql einige col kennt, kann nicht NULL sein, es wird count (col) optimieren intern zu zählen (*)

So vermute ich, dass die Zeit verbringen mehr wird verwendet, um diese Optimierungsarbeit zu machen.

+1

Wie wird 'id' definiert? – Matthew

+1

Suche ist dein Freund: https://duckduckgo.com/?q=mysql+count+performance&t=ffsb - es gibt viele Blog-Beiträge zu diesem Thema. – Augusto

+1

Mögliches Duplikat von [was ist schneller, Anzahl (\ *) oder Anzahl (Tabelle \ _field \ _name) in mysql?] (Http://StackOverflow.com/questions/7515531/whats-faster-count-or-counttable-field -name-in-mysql) – Augusto

Antwort

8

Oft hätte COUNT(*) geringfügig bessere Leistung. COUNT(id) muss überprüft werden, ob id nicht NULL ist, damit es funktioniert. Das bedeutet, dass er den Wert lesen muss (sowie den geringen Overhead für die Überprüfung).

Ich würde erwarten, dass die Zeiten in den meisten Datenbanken gleich sind, wenn id ein geclusterter Primärschlüssel ist. Vielleicht vermeidet der MySQL-Optimierer jedoch die NULL Prüfung sogar für Spalten, die NOT NULL deklariert sind.

Hinweis: Wenn Sie Timings durchführen, müssen Sie sehr vorsichtig sein, wenn Sie mit einem Cold-Cache beginnen. In Ihrem Fall scheint die schnellere Abfrage die erste zu sein, so dass Caching keine wahrscheinliche Erklärung für den Leistungsunterschied ist.

+0

Ja, von hoher Leistung MySQL, Ich habe: "Wenn mysql weiß, dass ein col nicht NULL sein kann, wird count (col) optimiert, um (*) intern zu zählen". So vermute ich, dass die Zeit mehr verwendet wird, um diese Optimierungsarbeit zu machen. – zhuguowei

4

COUNT (*) werden alle Zeilen der Tabelle zählen

COUNT (Spalte) nur Ihrer Tabelle nicht-NULL-Werte Spalten zählen.

Sie können dies article:

Die Sache ist count (*) Abfrage verwenden können, kann nicht Index sogar während count (col) abdeckt.Natürlich können Sie den Index auf (i, val) erweitern und Abfrage erhalten, um Index wieder abgedeckt werden, aber ich würde diese Problemumgehung nur verwenden, wenn Sie die Abfrage nicht ändern können (dh es ist Drittanbieteranwendung) oder in Fall Spaltenname ist in der Abfrage für Grund, und Sie müssen wirklich zählen von Nicht-NULL-Werten.

0

diese count (*) Fails 1 sagen und ist 0 this Fails say 1 and is 0

alle fixiert wurde, durch Zählung ids der zweiten Tabelle !!!

enter image description here