BINARY问题:
今天线上遇到了一个很奇怪的问题,由一条慢sql造成的cpu达到100%,这里来做个记录。
这是一张模仿该问题的测试表,表结构如下(重点注意排序规则是不区分大小写的):
这时候我们想做个区分大小写的查询,常规的做法是使用binary:
select * from binary_test where binary new_name="114abc";
执行计划如下:
这样其实是没有用到索引的,扫描行数为999行,全表扫描,可能会有人说type类型是index,应该是走索引的啊,这是因为我们这张表一共两个字段,一个主键,一个索引字段
,所以查询的是覆盖索引。接下来我们把表加两个字段,再做下执行计划分析。
现在的表结构:
再看现在的执行计划:
接下来我们换种写法:
select * from binary_test where new_name=binary "114abc";
执行计划如下:
可以看到已经用到了索引,问题解决。
再说明一下,这里看到的rows是2,因为我的表里有两条数据114abc,114ABC,可以看出的是这个索引查询是搜索到了这两条数据,最后再用binary对这两条数据做判断。