MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 4294|回复: 2
打印 上一主题 下一主题

调用存储过程,查询数据,mysql内存疯涨

[复制链接]
跳转到指定楼层
1#
发表于 2013-9-11 22:45:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


大家好:

               环境: 一台服务器,6G内存,4核CPU,操作系统:windows server2008,MySQL版本5.6.20

               数据库设置,创建了2个数据库,1一个数据库A有6张表,1个数据库B有1张表。每个数据库的每张表都创建了一个存储过程,存储过程的作用是向对应的表里插入数据。此外,有一个数据库还创建了其他几个存储过程,主要是实现查询数据。

              MYSQL  采用的是innoDB存储引擎,innodb_buffer_pool_size=1G

               步骤: 1、创建数据库、数据表、存储过程
                            2、插入数据,为了测试,只给其中的一张表插入了数据,总共插入了2000条记录。后面的测试程序就会调用存储过程A,该存储过程A就是查询这张表。
                           3、写Demo程序,程序的作用是连接数据库,间隔5秒钟,调用存储过程A,实现数据查询。
                           4、测试开始,demo程序通过odbc驱动正常连接mysql服务器,并调用存储过程A,并返回了指定的数据,在连接mysql后,连接就没有断开。
                            5、测试结果是,mysql进程内存以几十K的速度涨。测试一天,mysql进程从700多M,已经占用到了1.7G。
                           6、测试中,数据库连接数只有测试程序在连接,没有其他客户端连接数据库.


                存储过程A, 代码处理流程:  

                             1、创建临时表,临时表只有一个字段,varchar类型,
                             2、  根据传入的参数(开始时间和结束时间), 从数据库B中查找,哪些表在该时间范围内,如果在该时间范围内,就把表的名称插入到临时表中。
                             3、读取临时表记录,并根据记录生成动态sql语句 语句: select * from (select * from 表A where ('时间' > '开始时间)' and ('时间' < '结束时间') union all select * from 表B where ('时间' > '开始时间)' and ('时间' < '结束时间') union all ...) as temptb order by cid asc limit x, y;  主要是根据判断满足条件的表的记录是否满足,如果满足就采用union集合记录,并进行排序,然后根据传入的参数,取第几页的数据。
                             4、测试的情况,临时表里只有一条记录,也就是数据库B中只有一张表,即这张表中2000条记录中判断满足条件的记录,然后集合起来再排序,然后取第几页数据。
                            5、测试中,是取了100条记录数据,

                      请大家帮忙分析下,这个原因:为什么mysql内存疯涨不停,











分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
2#
发表于 2013-9-12 10:05:59 | 只看该作者
问题过程描述的很详细。

我觉得有几个重点你需要关注下:
1、表中时间字段要有索引
2、可以设置wait_timeout=120,interactive_timeout = 120这两个参数,减少长连接,及时释放些内存,max_connections=200这个参数也要设(数值根据自己的需要).
3、你的SQL属于大SQL(一层层套用),数量大的情况,效果不好。尽量的用简单的,小的SQL单步一步步完成。4、打开慢日志 slow log,查看其中的慢日志,针对性的查看SQL问题。
5、测试中用show processlist查看进程运行情况,看看有何异常...
6、也可以用explain来分析你的SQL执行情况,做相应调整


3#
 楼主| 发表于 2013-9-12 10:17:15 | 只看该作者
kider 发表于 2013-9-12 10:05
问题过程描述的很详细。

我觉得有几个重点你需要关注下:

谢谢, 您的回复,,

         我会按你的建议,去测试下,,

         像我这样的测试, demo程序一直连接这mysql数据库,就一直没有断过,今天测试结果是,mysql服务器已经挂掉了。mysql进程占用内存已经上了2G
         日志信息:
2013-09-12 05:26:22 11592 [ERROR] Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space。

           我就想知道为什么mysql服务没有释放资源内,难道必须要断开客户端的连接? mysql才会释放该连接所占用的一切资源。

           而,实际使用中,我们可能外面要用连接池,连接池已启动,就可以有50或100个mysql连接数,而且这些连接都是长连接,一般情况下,不会断开。

             最后,还是谢谢你的回复。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-5-9 02:43 , Processed in 0.134916 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表