[MySQL优化案例]系列 -- 频繁创建临时表
引言:某客户新上线一个项目,利用存储过程处理用户登录相关事务。在存储过程中,需要对用户数据进行处理,于是他们采用临时表(temporary table)来做这个动作,先创建一个临时表,然后插入数据,处理;由于是采用连接池方式,担心临时表被复用,于是在最后删除该临时表。该客户采用16G的2950机器做mysql db server,利用loadrunner进行模拟登录测试,发现并发量达到2,30万之后,就再也上不去了,而且峰值不是很稳定的处于30多万的级别上。
一开始以为是机器性能达到了极限,经过询问各种状况后,认为应该还可以得到改进和优化。经过现场分析后,发现在测试达到峰值时,会有大量的 "waiting for table",以及大量的 create temporary table 和 drop table 的线程在等待。很明显,瓶颈在于频繁的创建和删除临时表,mysql需要频繁的处理打开和关闭表描述符,才会导致了上面的问题。还好他们采用了连接池,否则情况将会更糟糕。建议他们把最后的 drop table 改成 truncate table,把临时表清空了,也就不会担心下一次调用时临时表不为空了,省去了频繁的处理表文件描述符,并发用户数也稳定的保持在了40多万。
附:上面提到的数字,仅作参考,均为该客户自行提供。
评论
游客 (未验证)
周二, 2009/02/17 - 18:13
Permalink
并发40万? wait time
并发40万? wait time 是多少?
你客户这个测试都可以创造世界记录了吧?
yejr
周二, 2009/02/17 - 19:30
Permalink
采用连接池方式,无
采用连接池方式,无需关注wait timeout;另外,40w并发登录登出,怎么可能是世界纪录?何况是什么配置的机器。
MySQL方案、培训、支持
游客 (未验证)
周三, 2009/02/18 - 12:46
Permalink
不知道多少db
不知道多少db server支持 40w并发登录…能有40w并发登录的,估计不是小公司啊
游客 (未验证)
周二, 2009/02/17 - 19:53
Permalink
哈哈,40万!
哈哈,40万!
游客 (未验证)
周三, 2009/03/04 - 18:36
Permalink
40w是有点夸张啊,怎
40w是有点夸张啊,怎么计算出来的啊。40多同时登录么,就用一台机器?