【问题标题】:Insert only adds upto 1000 records and ignoresall records after thatInsert 最多只添加 1000 条记录,之后忽略所有记录
【发布时间】:2011-01-02 19:40:37
【问题描述】:

我有一个大型数据库,客户端在其中存储个人消息并触发电子邮件通知 [如果用户允许]。某些用户可以选择向他们的整个朋友网络发送消息。一些用户在他们的网络中有超过 5000 个朋友,所以如果他们选择整个网络,他们将向超过 5000 个朋友发送消息,系统会将所有消息存储到一个表中。问题是它不会插入超过 1000 条记录并忽略前 1000 条之后的所有插入。我增加了数据包大小,bulk_insert_buffer_size 但仍然没有运气。由于系统将一些信息存储在另一个表中以供报告,因此每个插入都返回其新的消息 ID。因此,我不能使用“插入表(column1,column2)值(value1,value2),(value1,value2)......等等。”

表引擎是 innodb,mysql 版本是 5.1.3,托管在亚马逊网络服务上。我只想解决一次插入超过 1000 条记录的问题。如前所述,它可以正常工作,但最多只能记录 1000 条记录,之后会忽略所有记录。

我正在使用 php foreach(){} 为每个朋友插入消息,如果电子邮件可用,则向用户发送通知。此 foreach(){} 还会在另一个表 [只有 3 列] 中插入相同的记录以生成报告。

【问题讨论】:

  • 你的脚本执行需要多长时间?
  • 您能否发布一段简短的 sn-p 代码来说明问题所在?您如何确定只有 1000 条记录被插入 - 检查表,或者 MySQL 返回一些错误或警告?这是一个在 web 上下文中运行的 PHP 脚本,它是否遇到了某种超时?
  • 感谢您的快速回复。非常感激。 sikas,插入 1000 条记录大约需要 15 秒。 Rob,它是一个简单的 php 脚本,它从表单接收信息并检索朋友的 ID 以传递消息和电子邮件。所有这些都发生在一个 foreach 循环中,它一次插入 2 条记录 [1 为“收件箱”,第二条为“已发送”]。 'sent' 返回新消息的 id 并将其存储到日志表中以供报告。它不会产生任何错误/警告或超时。我检查数据库中的记录号,如果插入超过 1000 条,它总是有 1000 条记录。

标签: php mysql insert limit records


【解决方案1】:

您是否尝试将查询拆分为更多子查询?也许在单个事务中(因为您使用 InnoDB)?

我不确定亚马逊是否限制每个查询的插入次数,但只要他们不限制 SQL 查询的数量,您就可以做更多 INSERTs 并且应该能够修复。

顺便问一下,你确定明文查询插入了所有 5000 个元素吗?可能是您的代码返回最多 1000 行的纯文本查询吗?您的SELECT 查询中是否有任何LIMIT 语句,我想您在读取数据时会执行这些语句?

【讨论】:

    【解决方案2】:

    没有必要通过循环执行插入

    您可以分配一个唯一的交易 ID,如下所示

    create sent_message 
    (
      user_id int(10), 
      friend_id int(10), 
      batch_id int(10), 
      message text
    );
    
    /* user 1001 sent message to all his 5000 friends */
    $timestamp = time();
    
    insert into sent_message 
      select 1001, friend_id, $timestamp, friend_id, '$message'
      from user_friend where user_id=1001;
    
    /* email notification */
    select email 
    from 
      user_profile
    inner join sent_message
    on user_profile.user_id=sent_message.friend_id
    where 
      sent_message.uid=1001 and 
      batch_id=$timestamp and
      user_profile.email!='';
    
    /* loop the result and send the email notification
       or to attach all the emails into an email alias, 
       then send via assigned email alias */
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      相关资源
      最近更新 更多