今天中午1点多休息的时候突然用户反馈页面出不来结果,连忙排查了服务器和数据库,发现服务器cpu、内存都正常,数据库阻塞了一大堆sql,那就是sql的事了,单独取出来一个分析,过程就不再赘述了,大致就是查看执行计划发现有索引的字段执行计划中显示 Using join buffer (Block Nested Loop)**,**说明索引失效,sql大概是这样:
JOIN pur_purchase_order_detail F ON C.purchase_order_detail_id = F.id
AND C.purchase_order_id = F.purchase_order_id
JOIN pur_purchase_order G ON C.purchase_order_id = G.id
1.先检查了表的索引,都在
2.后来发现俩表的字符集不一样,一个是 utf8mb4 一个是 utf8 ,然后看了下排序规则,发现排序规则也不一样
问题找到了,那就好办了
1.直接 alter
- 新建一个字符集和排序规则一样的表,把表数据整到新表里,然后rename
执行的过程中把所有相关的sql全部杀掉,就成功改完了,接下来就是排查整个数据库的字符集和排序规则,空闲的时候刷成一致。
但是还有一个问题想请大神们解答一下,为啥字符集一直就不一样,之前也好用,突然就不好用了?