2017-08-09 3 views
1

Ich habe eine Tabelle mit 150k Zeilen von Daten, und ich habe Spalte mit einer UNIQUE INDEX, Es hat eine Art von VARCHAR(10) und speichert 10-stellige Kontonummern. JetztMySQL Index manchmal nicht verwendet

, wenn ich frage, wie ein einfacher:

SELECT * FROM table WHERE account_number LIKE '0103%'

Es 30.000+ ROWS führt, und wenn ich eine auf meiner Abfrage ausführen ERKLäRT Es zeigt keinen Index verwendet wird. Aber

, wenn ich tun:

SELECT * FROM table WHERE account_number LIKE '0104%'

Es führt mehr als 4.000 Zeilen mit dem Index verwendet.

Jeder kann das erklären?

I'm using MySQL 5.7 Percona XtraDB.

+1

'30k +/150k'> 20% und ich denke, es ist schneller zu tun Tabelle Scan. – lad2025

+0

Warum wird bei 4k Zeilen Index verwendet? es ist jedoch kleiner als 30k. –

+0

'Warum wird bei 4k Zeilen der Index immer noch nicht benutzt?' Vs 'Es ergeben sich 4.000+ Zeilen mit dem verwendeten INDEX. Bitte entscheiden – lad2025

Antwort

3

30k +/150k> 20%, und ich denke, es ist schneller Tabellenscan zu tun. Von 8.2.1.19 Avoiding Full Table Scans:

Die Ausgabe von EXPLAIN zeigt alle in der Spalte Typ, wenn MySQL einen vollständigen Tabellenscan verwendet eine Abfrage zu lösen. Dies geschieht normalerweise unter den folgenden Bedingungen:

Sie verwenden einen Schlüssel mit niedriger Kardinalität (viele Zeilen entsprechen dem Schlüsselwert) durch eine andere Spalte. In diesem Fall geht MySQL davon aus, dass bei Verwendung des Schlüssels wahrscheinlich viele Schlüsselsuchen durchgeführt werden und dass ein Tabellenscan schneller ist.

Wenn Sie nicht alle Werte müssen versuchen, zu verwenden:

SELECT account_number FROM table WHERE account_number LIKE '0103%' 

statt SELECT *. Dann wird Ihr Index zum Index und der Optimierer sollte ihn immer benutzen (solange die Bedingung SARGable ist).

+0

Danke, das dachte ich mir auch, der Index wurde auch bei possible_keys angezeigt, wurde aber nicht benutzt, schätze ich sollte den Optimizer nicht in Frage stellen. –

+0

@ JohnPangilinan Der Optimierer ist nicht immer richtig. Manchmal erzeugt es wirklich dumme Pläne. –

1

lad2025 ist korrekt. Die Datenbank versucht, eine intelligente Optimierung vorzunehmen.

Benchmark mit:

SELECT * FROM table FORCE INDEX(table_index) WHERE account_number LIKE '0103%' 

und sehen, wer schlauer ist :-) Sie immer Ihre Hand auf Befragung der Optimierer versuchen. Das sind die Indexhinweise für ...
https://dev.mysql.com/doc/refman/5.7/en/index-hints.html

1

Die meisten Datenbank verwendet B-Struktur für Indexierung. In diesem Fall verwendet der Datenbankoptimierer den Index nicht, da er schneller ohne Index gescannt werden kann. Wie @ Lad2025 erklärt.

Ihre Datenbankspalte ist einzigartig und ich denke, Ihre Kardinalität Ihres Index ist hoch. Da Ihre Abfrage den Like-Filter verwendet, entscheidet der Datenbankoptimierer, dass Sie den Index nicht verwenden möchten.

Sie können try force index verwenden, um das Ergebnis zu sehen. Verwenden Sie varchar mit dem eindeutigen Index. Ich würde einen anderen Datentyp wählen oder Ihren Indextyp ändern. Wenn Ihre Tabelle nur Zahlen enthält, ändern Sie sie in Zahlen. Dies wird Ihnen helfen, Ihre Anfrage zu optimieren.

In einigen Fällen, wenn Sie verwenden müssen, können Sie den Volltextindex verwenden.

Wenn Sie Hilfe bei der Optimierung Ihrer Abfrage und Tabelle benötigen. Geben Sie uns weitere Informationen und welche Informationen Sie von Ihrem Tisch holen möchten.

Verwandte Themen