我刚刚遇到了一些奇怪的事情。base_id 是一个 varchar(255)。当我执行不带引号的 SELECT 时,它会扫描整个表:
mysql> EXPLAIN SELECT sid FROM rf_fo.scald_atoms WHERE base_id = 493457;
+----+-------------+-------------+-------+---------------+---------+---------+------+-------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+---------+---------+------+-------+--------------------------+
| 1 | SIMPLE | scald_atoms | index | base_id | base_id | 767 | NULL | 84404 | Using where; Using index |
+----+-------------+-------------+-------+---------------+---------+---------+------+-------+--------------------------+
1 row in set (0.00 sec)
有报价就OK了。
mysql> EXPLAIN SELECT sid FROM rf_fo.scald_atoms WHERE base_id = '493457';
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------------+
| 1 | SIMPLE | scald_atoms | const | base_id | base_id | 767 | const | 1 | Using index |
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------------+
1 row in set (0.00 sec)
这完全有道理。
既然你说 base_id 是 VARCHAR(255),你的第一个查询
真的是这样的
这会导致每个 base_id 都经历一次 CAST 和比较。需要全表扫描。
您的第二个查询是纯字符串比较,并且索引具有基于字符串的值。