[MySQL优化案例]系列 -- 频繁创建临时表

引言:某客户新上线一个项目,利用存储过程处理用户登录相关事务。在存储过程中,需要对用户数据进行处理,于是他们采用临时表(temporary table)来做这个动作,先创建一个临时表,然后插入数据,处理;由于是采用连接池方式,担心临时表被复用,于是在最后删除该临时表。该客户采用16G的2950机器做mysql db server,利用loadrunner进行模拟登录测试,发现并发量达到2,30万之后,就再也上不去了,而且峰值不是很稳定的处于30多万的级别上。
一开始以为是机器性能达到了极限,经过询问各种状况后,认为应该还可以得到改进和优化。经过现场分析后,发现在测试达到峰值时,会有大量的 "waiting for table",以及大量的 create temporary tabledrop table 的线程在等待。很明显,瓶颈在于频繁的创建和删除临时表,mysql需要频繁的处理打开和关闭表描述符,才会导致了上面的问题。还好他们采用了连接池,否则情况将会更糟糕。建议他们把最后的 drop table 改成 truncate table,把临时表清空了,也就不会担心下一次调用时临时表不为空了,省去了频繁的处理表文件描述符,并发用户数也稳定的保持在了40多万。

附:上面提到的数字,仅作参考,均为该客户自行提供。

评论

并发40万? wait time 是多少?

你客户这个测试都可以创造世界记录了吧?

采用连接池方式,无需关注wait timeout;另外,40w并发登录登出,怎么可能是世界纪录?何况是什么配置的机器。

MySQL方案、培训、支持

不知道多少db server支持 40w并发登录…能有40w并发登录的,估计不是小公司啊

哈哈,40万!

40w是有点夸张啊,怎么计算出来的啊。40多同时登录么,就用一台机器?