项目场景:
项目中总是有查询很慢的时候 相当于就是Sending data数据的时候很慢
问题描述:
这时候我们就要看他的处理过程了
show processlist;
这时可以查看他的 State 状态,他的状态可能是 Sending data
这是MySQL在做 “收集 + 发送 数据”;
在进一步排查
show profile;
这时候就看Duration哪里耗时最长
哪里耗时最长就是哪里的问题
一般是Sending data
也可以这样看一下
explain select * from table;
排查对比:
1. 表的设计一个字段为 XXX varchar(6000) DEFAULT NULL,而且该表中也有text类型为空的字段
2. 连表查询数据量大
原因分析:
- 当Innodb的存储格式是 ROW_FORMAT=COMPACT (or ROW_FORMAT=REDUNDANT)的时候,Innodb只会存储前768字节的长度,剩余的数据存放到“溢出页”中。
show table status;
其实就是如果varchar类型如果长度过大的话,而且还是空的话,他会去比较,所以慢了
而且text类型也是会影响MySQL查询时候的速度,如果不是特殊情况最好不用
解决方案:
- 必要的查询时候去掉XXX字段查询,这是可以提高一下效率,设计的时候也最好不给长度过大。
- 像这种字段最好给 双引号 ’ ’ Empty String 这样会好一些
- 将该字段抽离出来,放到另外一张表里面,根据业务情况来定。