[[TOC]]
select * from user where substring(name,1,2)='xxx'select * from user where id-1=9select * from user where name like "%雷%"select * from user where age <> 30select * from user where name = null因为在mysql当中, 字符串和数值类型之间可以互相进行隐式转换。 因此这种问题导致的索引失效很常见,也很容易被忽略。
root@dmysql 10:36:14 [swltest] > create table t1(id int, name varchar(32), key idx_name(name));
root@dmysql 10:36:56 [swltest] > create table t2(id int, name int, key idx_name(name));
root@dmysql 10:40:12 [swltest] > select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+------+------+
root@dmysql 10:40:12 [swltest] > select * from t2;
+------+------+
| id | name |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+------+------+
-- 将t1作为驱动表, 使用name列做关联时, 可以使用t2表 name列上的索引
root@dmysql 10:40:00 [swltest] > explain select * from t1 join t2 on t1.name = t2.name where t1.id =1;
+----+-------------+-------+------------+------+---------------+----------+---------+-----------------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+----------+---------+-----------------+------+----------+-----------------------+