MySQL bit数据类型踩坑
测试突然报告前端无法接收数据,请求返回超时。
第一反应,代码又有BUG,脑袋急速运转。从请求入口处过细节,边看代码边往下走,三步并五步,流程走到底,没问题啊?怎么会超时呢?
网络?呼喊前端,答案是NO。咦,对网络确实不应该,再回忆一遍,数据库,这流程中有访问数据库。迅速查看定位那段代码,拿出SQL直接查询一下,18分钟才返回数据,要求秒级返回,这差距真大啊。
接着查看为什么返回慢呢?第一反应Index失效,果然
原来BIT数据类型存储格式是二进制,BIT当做字符串类型, 而不是数据类型。解决方案:
select * from tab where col1 = 'xx' and col2 = false;
创建联合索引
create index tab_col1_col2_index on tab(col1,col2);
上面的方案其实是一种折中方案,将原来18分钟才能返回的结果优化到110~150秒之间,长久之际还是要修改数据类型,将bit改为tinybit,或者其他类型不需要转换的,降低数据重复率,这样索引就不会失效。