【问题标题】:How to insert large amounts of data with PHP/MySQL?如何使用 PHP/MySQL 插入大量数据?
【发布时间】:2012-07-28 16:35:47
【问题描述】:

我目前正在为客户编写一个赌博系统,实际上,该系统的工作方式如下:

  • 票是我们创造的
  • 每张票都会被分配一定数量的数字
  • 共有 1,000,000 个,从 000,000 到 999,999 随机排序
  • 这 100 万个号码被分成票,每张票的号码数量由管理员定义。

现在的问题是,现在我们有一个随机排序的 100 万个数字的数组,这很好,但是将其插入数据库的最佳方法是什么?

我们有两张桌子

门票

  • 身份证
  • ticketUID
  • 奖品ID
  • 添加日期

票号

  • 身份证
  • ticketID
  • 号码

当用户决定将彩票添加到奖品中时,我们会循环并创建由每张彩票的总数决定的总彩票,例如每张票 1 个号码 = 100 万张票,等等……

现在我们循环检查每张票的总数,从我们的数字数组中添加多少,然后从原始数组中删除它,这样就没有重复的数字了。

现在问题出在哪里,这样会占用大量内存,并导致页面超时....

还有其他方法可以帮助解决这个问题吗?

附:我无法提供源代码,但这基本上就是我们正在做的事情,而我真正需要的是关于如何处理所有这些数据的插入的其他方法的理论。

提前致谢

【问题讨论】:

  • 你的插入现在是什么样子的?必要时晦涩难懂,但看看你现在是如何做的很有用。 INSERT INTO tickeNumbers (ID, tickedtID) VALUES ('$tid', $currnum), ('$tid', $currnum), ('$tid', $currnum), (...) 似乎并没有非常低效。
  • 您好,是的,这就是为什么我需要建议,因为它似乎效率很低,但不确定我还能如何插入如此大量的数据,我们基本上循环并创建如上所述的许多票证循环遍历,但是需要在每张票中插入许多数字,这意味着如果每张票有一个数字,我们插入 100 万张票,然后插入 100 万个数字...
  • 如果您或多或少地在 PHP 中循环执行数十万个单独的查询或其他任何事情...您认为效率低下发生在哪里?
  • 我假设我们实际上添加它的方式,事实上它直接从一个表单运行,因为下面的绅士提到了一个很好的方法是将它分成一个单独的线程,所以这就是我要做的。
  • 当然,您可以设置一个 cron 并将其卸载到其他地方。您必须小心不要假设它立即可用(并且 PHP 不是多线程的)。我最初的想法是写入文件并稍后处理文件,但首先,您需要知道哪里存在瓶颈。如果您正在循环、循环和循环并且仍然单独插入几十万个查询,是什么让您认为您不会在其他地方运行的脚本遇到超时?您需要知道实际问题是什么,而不仅仅是将其转移到其他地方。也记录任何输出。

标签: php mysql insert bulkinsert


【解决方案1】:

我不太喜欢赌博,所以不确定这些门票与赌博有什么关系。

也就是说,如果您真的需要创建如此大量的数据,有几个选项。例如,您可以将票证创建远离用户。我的意思是,每当用户决定“将门票添加到奖品中”时,您将此任务委托给另一个进程/线程并让用户继续前进。然后当票证的创建完成后,该进程会以某种方式通知用户。

【讨论】:

  • 谢谢,这真的很有帮助,它是 PHP,这里的票是由管理员创建的,然后用户购买票,奖品作为彩票赠送。
【解决方案2】:

如果不尝试一些东西,我目前想不出最好的解决方案 - 你真的必须首先将数字保存在数据库中吗?如果它是从 000000 到 999999 的普通数字,那么您可以即时生成它们,这可能会更有效。

为了克服超时问题,您可以随时增加默认 php 超时或完全禁用此特定任务:

//set php script timeout, 0 to disable 
set_time_limit(0); 

// your time consuming code 

//don't forget to reset to 30 seconds. 
set_time_limit(30); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2012-11-01
    相关资源
    最近更新 更多