2013-04-08 46 views
0

我有一个上传位置,因此用户可以使用上传的文件更新我的数据库的一部分。这些文件通常高达9GB,因此插入150,000,000行可能需要几分钟的时间。使用PHP阻止多个MySQL访问,但未锁定MySQL

点击网站上的按钮更新数据库后,PHP(使用mysqli)基本上进行了mysql锁定。如果我打开其他选项卡,则在大型更新完成之前它们不会得到任何内容。 但是,我知道它实际上并没有锁定数据库/表,因为从CLI我仍然可以“SELECT count(*)FROM table”,它立刻给我一个结果。

什么是最好的插入150,000,000条记录,同时让其他PHP页面访问数据库的方法(只读)?

+0

听起来像阿帕奇工作人员的数量已经超出了,所以它挂在请求,直到有一个免费的工人? – cdhowie 2013-04-08 21:44:56

+0

将它移动到cronjob .. – 2013-04-08 21:49:54

+0

这不是简单的Apache工作。创建另一个只是<?php echo'Test'?>的页面立即打开。它只在访问数据库的页面上遇到问题。 PHP在查询运行时工作正常,MySQL在查询运行时正常运行。这个问题似乎与MySQL + PHP组合有关。根据phpinfo(),mysqli.max_links被设置为无限。我似乎无法弄清楚问题可能是什么。 – 2013-04-09 15:13:38

回答

1

您可以使用“INSERT DELAYED”。 INSERT语句的DELAYED选项是标准SQL的MySQL扩展,如果您的客户端不能或不需要等待INSERT完成,那么它非常有用。当您使用MySQL进行日志记录时,这是一种常见情况,并且您还会定期运行需要很长时间才能完成的SELECT和UPDATE语句。

你可以在官方文档here上阅读这个资源。

;-)

+0

这听起来合乎逻辑,但似乎没有帮助。我想我有更多的PHP块比MySQL块。我已经可以从PHP以外的其他地方访问MySQL了。有多少东西可以同时访问数据库有一个PHP或mysqli限制? – 2013-04-09 14:34:26

0

问题出在会议上。

由于上传在会话中针对登录进行了验证,并且我在启动db之前未能执行session_write_close(),因此会话文件在整个9GB读写数据库时保持锁定状态。

这解释了为什么我仍然可以使用CLI mysql和基本的PHP(我用来测试的基本PHP没有会话)。