2017-05-25 3 views
1

Ich habe unterschiedliche Verhaltensweisen bei der Ausführung einer Abfrage mit einfachen Anführungszeichen und ohne einfache Anführungszeichen beobachtet.Warum unterscheidet sich das Select-Abfrageverhalten von einfachen Anführungszeichen in where-Bedingung und ohne einfache Anführungszeichen?

Mit einfachen Anführungszeichen ('121') Ich habe das Ergebnis schnell und Abfrage verwendet Index gut. Aber ohne Anführungszeichen verwendet die Abfrage den Index nicht und die Antwortzeit ist hoch.

mysql> explain select * from tbl_n1 where id =121; 
+----+-------------+----------------------+------+---------------+------+---------+------+--------+-------------+ 
| id | select_type | table    | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+----------------------+------+---------------+------+---------+------+--------+-------------+ 
| 1 | SIMPLE  | tbl_n1    | ALL | n1_id  | NULL | NULL | NULL | 286929 | Using where | 
+----+-------------+----------------------+------+---------------+------+---------+------+--------+-------------+ 
1 row in set (0.00 sec) 

mysql> explain select * from tbl_n1 where id ='121'; 
+----+-------------+----------------------+------+---------------+----------+---------+-------+------+-------------+ 
| id | select_type | table    | type | possible_keys | key  | key_len | ref | rows | Extra  | 
+----+-------------+----------------------+------+---------------+----------+---------+-------+------+-------------+ 
| 1 | SIMPLE  | tbl_n1    | ref | n1_id  | n1_id | 53  | const | 29 | Using where | 
+----+-------------+----------------------+------+---------------+----------+---------+-------+------+-------------+ 
1 row in set (0.00 sec) 


show create table tbl_n1\G 
.... 
.... 
`id` varchar(10) DEFAULT NULL, 
.... 
.... 
.... 
+0

Kein Problem, werde ich diesen Kommentar und dank löschen! –

Antwort

5

Da die Definition des Feldes id ist varchar, ohne die Apostrophe die Datenbank muss eine implizite Konvertierung des Feldes id Anlegen eines gegossenen (oder was auch immer Funktion es zu einem varchar konvertieren), die wird verhindert, dass die Verwendung des Index idx_1055

Lesen sie diesen Artikel über sie: Type Conversion in Expression Evaluation

+1

Ich frage mich, warum würde es nicht konvertieren rechten Wert in String statt? In diesem Fall könnte es den Index verwenden. –

+1

Ich stimme immer noch sehr seltsam zu. In Postgres wäre die implizite Konvertierung eine Konstante und würde immer noch den Index verwenden. –

+0

Ja, es könnte prüfen, was die beste Übereinstimmung wäre und die entsprechende Umwandlung machen, so dass es den Index verwendet. Ich nehme an, dass es genau so ist, wie die MySql-Leute es implementiert haben. –

Verwandte Themen