2016-05-10 17 views
1

Ich habe eine Tabelle mit einem Feld "aktiv". Aktiv ist ein indexiertes tinyint (4), enthält aber nur einen Wert von 1 oder 0. Ich weiß ... kein tolles Design, aber ich habe dieses System geerbt, um es zu erhalten.MySQL Integer Vergleichsgeschwindigkeit (= vs <>)

Wenn es hilft, hat diese Tabelle 175277 Datensätze.

Wenn ich laufen:

SELECT * FROM table WHERE active = 1; 

es 0,497 Sekunden dauert.

aber wenn ich

SELECT * FROM table WHERE active <> 0; 

laufe (aktiv muss gleich 1 Ursache den einzig möglichen anderen Wert das ist.)

Es dauert nur 0,095 Sekunden.

Ich habe einige Abfrage Optimierung getan und bemerkte dies und fragte mich warum?

+1

Wie weiß die Datenbank, dass es entweder das eine oder das andere? Also die beiden Aussagen sind nicht das gleiche –

+2

Überprüfen Sie die 'EXPLAIN' – zerkms

+0

' EXPLAIN' beantwortet es. Der Motor entschied sich für einen anderen Schlüssel. Vielen Dank! –

Antwort

0

Gelöst!

Wie oben vorgeschlagen, habe ich EXPLAIN verwendet, um zu sehen, was die Abfrage tut, und es stellte sich heraus, dass die Engine entschied, einen anderen Schlüssel für jede Abfrage zu verwenden.

+0

Wenn ein Index eine niedrige Kardinalität wie diese aufweist, kann der Optimierer entscheiden, dass eine Indexsuche weniger effizient ist als nur das Scannen der gesamten Tabelle. Manchmal ist das richtig, manchmal falsch. Manchmal bewirkt 'ANALYZE TABLE', dass sich die Indexstatistiken verschieben und die identische Abfrage einen anderen Plan verwendet. –