因为需要启动时load数据到内存,重启数据库很慢

我在做贴吧系统的时候,每次访问页面都要请求一次权限。所以,这个请求权限的请求, 访问概率会非常高,不可能每次都去数据库里查,怎么办呢?
我想了个简单的方案:在应用程序里面开了个很大的内存,启动的时候就把整张表全部 load 到内存里去。这样再有权限请求的时候,直接从内存里取就行了。 数据库重启时,我的进程也会跟着重启,接下来就会到数据表里面做全表扫描,把整个用户相关信息全部塞到内存里面去。 但是,后来我遇到了一个很郁闷的情况。有时候 MySQL 崩溃了,我的程序重新加载权限 到内存里,结果这个 select 语句要执行 30 分钟左右。本来 MySQL 正常重启一下是很快的,进程重启也很快,正常加载权限的过程只需要两分钟就跑完了。但是,为什么异常重启的时候就要 30 分钟呢
 
 
我没辙了,只好去看源码。然后,我发现 MySQL 有个机制,当它觉得系统空闲时会尽量 去刷脏页。 具体到我们的例子里MySQL 重启以后,会执行我的进程做全表扫描,但是因为这个时 候权限数据还没有初始化完成,我的 Server 层不可能提供服务,于是MySQL 里面就只有我那一个 select 全表扫描的请求,MySQL 就认为现在很闲,开始拼命地刷脏页,结果就吃掉了大量的磁盘资源,导致我的全表扫描也跑得很慢。 知道了这个机制以后,我就写了个脚本,每隔 0.5 秒发一个请求,执行一个简单的 SQL 查
询,告诉数据库其实我现在很忙,脏页刷得慢一点。脚本一发布使用,脏页果然刷得慢了,加载权限的扫描也跑得很快了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值