MySQL: Vergleich des Ganzzahl-und string-Feld mit dem index
Tabelle a_table
hat index auf string_column
.
Ich habe eine Abfrage:
SELECT * FROM a_table WHERE string_column = 10;
Ich verwendet EXPLAIN
zu finden, die keine Indizes verwendet werden.
Warum? Könnten Sie mir helfen mit MySQL-link zur Dokumentation?
Aktualisiert: Sandbox (SQL Fiddle)
- Finden Sie auf dieser Seite dev.mysql.com/doc/refman/4.1/en/mysql-indexes.html .. 3. Punkt
Comparison of dissimilar columns may prevent use of indexes if values cannot be compared directly without conversion. Suppose that a numeric column is compared to a string column. For a given value such as 1 in the numeric column, it might compare equal to any number of values in the string column such as '1', ' 1', '00001', or '01.e1'. This rules out use of any indexes for the string column.
- Tatsächlich, 10 nicht eine Spalte (ich sah, dass dieser text in der Dokumentation vor). So kann es in eine Zeichenfolge konvertiert werden, die der erforderlichen Art.
- Prüfen Sie das sqlfiddle.com/#!2/f4807/1 für string-zu-int-Konvertierungs-index verwendet wird, während für int zu string folgt daraus nicht, obwohl ich
force index
..
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der wesentliche Punkt ist, dass der index nicht verwendet werden, wenn der Datenbank zu tun hat, eine Umwandlung auf die Tabelle-Seite der Vergleich.
Außerdem, dass die DB immer Unterschwanzdecken Streicher -> Zahlen, denn dies ist die deterministische Weise (sonst 1 umgewandelt werden kann, um '01', '001', wie erwähnt, in den Kommentaren).
Also, wenn wir vergleichen die beiden Fälle scheinen Sie zu verwirren:
Die DB wandelt die Zeichenkette '1' die Zahl 1 und dann die Abfrage ausführt. Es hat endlich int auf beiden Seiten, so kann es den index verwenden.
Wieder, es konvertiert den string zu zahlen. Aber dieses mal hat es zum konvertieren der Daten in der Tabelle gespeichert. In der Tat, Sie sind der Durchführung einer Suche wie
cast(str_column as int) = 1
. Das bedeutet, Sie sind nicht auf der Suche auf die indizierten Daten mehr, die DB nicht den index verwenden.Bitte haben Sie einen Blick auf diese für weitere details: