目录
1.字段上加函数
《查询条件的字段上不要套函数,索引会失效》这句话是不是听烂了,WHY?
select count(*) from t where method(a) = 'xx';
破坏了索引的有序,如果字段a是索引字段,a对应的索引树排序一定是按a来的
2.隐式类型转换
两个前置知识点
- 字符串和数字类型对比,会把字符串转成数字对比
- 上述的字段加函数 索引不生效
case
字段id_str类型是varchar,匹配值是数字类型
select count(*) from t where id_str = 12345; 这个会转化成数字类型比较所以 这个sql等同于
select count(*) from t where cast( id_str , int) = 12345; <完犊子了>
3.join的时候 两张表的关联字段 字符集不同
前置知识点
utf8mb4(most bytes 4)是utf8的超集,一般用来兼容表情符号和生僻的汉字(四个字节的符号utf8无法搞定)
case
select t1.c1 from t1 , t2 where t1.c2 = t2.c2 and t1.c3 = 'c3';
t1是utf-8 , t2是utf-8mb4,会把utf8转成utf8mb4在比较,等同于
select t1.c1 from t1 , t2 where convert(t1.c2 useing utf8mb4) = t2.c2 and t1.c3 = 'c3';
上述场景 t1是驱动表,t2是被驱动表,如果反过来 还是可以走索引的