mysql性能分析之隐式类型转化
之前遇到过一个问题,建表时将字段status的类型设置为varchar,插入数据时,该字段的值只有0和1两种情况,在该字段上建立索引,使用where status=1查询时却并没有走索引。如下所示:
1.表结构及索引
总共有800万条数据
2.使用explain查看执行命令的索引使用情况
由上图可以看出,执行select count(*) from vip_test_details where status=1时扫描了700多万条数据,并没有使用索引query_index0。
使用show warnings查看报警信息提示由于在字段status上存在类型或者排序转换,所以不能使用索引query_index0,也就是说mysql为了方便与where条件中的1进行比较,把全表中的status值都转换成了数字型,导致了全表扫描。
修改一下执行的命令,将where条件中的1修改为字符串,如下所示:
由上可以看出,该次查询使用了索引query_index0,只过滤了469条数据,之前的查询没有使用索引,是因为where条件的类型不正确,导致mysql进行了 隐式类型转换。