Вставка добавляет только до 1000 записей и игнорирует все записи после этого.

у меня есть большая база данных, в которой клиент хранит личные сообщения и уведомляет об огне по электронной почте [если это разрешено пользователями]. некоторые пользователи имеют возможность отправлять сообщения всей своей сети друзей. некоторые пользователи имеют более 5000 друзей в своей сети, поэтому, если они выберут всю сеть, они будут отправлять сообщения более чем 5000 друзьям, и система сохранит все сообщения в таблице. проблема в том, что он не вставляет более 1000 записей и игнорирует все вставки после первых 1000. Я увеличил размер пакета, bulk_insert_buffer_size, но все равно не повезло. поскольку система хранит часть информации в другой таблице для отчетов, каждая вставка возвращает свой новый идентификатор сообщения. из-за этого я не могу использовать «вставить в таблицу (столбец 1, столбец 2) значения (значение 1, значение 2), (значение 1, значение 2) .... и т. д.».

движок таблицы — innodb, версия mysql — 5.1.3 и размещена на веб-сервисах amazon. все, что я хочу, это исправить эту проблему вставки более 1000 записей за раз. как упоминалось ранее, он работает нормально, но только до 1000 записей и просто игнорирует все записи после этого.

я использую php foreach(){}, чтобы вставить сообщение для каждого друга и, если электронная почта доступна, отправить уведомление пользователю. этот foreach(){} также вставляет ту же запись в другую таблицу [только с 3 столбцами] для создания отчетов.


person user560559    schedule 02.01.2011    source источник
comment
сколько времени занимает выполнение вашего скрипта?   -  person sikas    schedule 02.01.2011
comment
Можете ли вы опубликовать короткий фрагмент кода, демонстрирующий, в чем проблема? Как вы определяете, что вставляется только 1000 записей - проверка таблицы или MySQL возвращает какую-то ошибку или предупреждение? Это PHP-скрипт, работающий в веб-контексте, и он сталкивается с каким-то тайм-аутом?   -  person Rob    schedule 02.01.2011
comment
спасибо за быстрые ответы. очень признателен. sikas, для вставки 1000 записей требуется около 15 секунд. Роб, это простой php-скрипт, который получает информацию из формы и извлекает идентификаторы друзей для доставки сообщений и электронных писем. все это происходит внутри цикла foreach, и он вставляет 2 записи за раз [1 как «входящие» и 2-е как «отправленные»]. 'sent' возвращает идентификатор нового сообщения и сохраняет его в таблице журнала для отчетов. он не генерирует ошибок/предупреждений или тайм-аутов. я проверяю номера записей в базе данных, и это всегда 1000 записей, если вставок было более 1000+.   -  person user560559    schedule 02.01.2011


Ответы (2)


Вы пытались разбить запрос на несколько подзапросов? Может быть, внутри одной транзакции (поскольку вы используете InnoDB)?

Я не уверен, ограничивает ли Amazon количество вставок для каждого запроса, но как только они не ограничивают количество SQL-запросов, вы можете делать больше INSERT и сможете это исправить.

Кстати, вы уверены, что простой текстовый запрос вставляет все 5000 элементов? Может быть, ваш код возвращает простой текстовый запрос до 1000 строк? Есть ли у вас какие-либо операторы LIMIT в ваших SELECT запросах, которые, я полагаю, вы выполняете при чтении данных?

person usr-local-ΕΨΗΕΛΩΝ    schedule 02.01.2011

нет необходимости выполнять вставку через цикл

вы можете назначить уникальный идентификатор транзакции, как показано ниже

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 */
person ajreal    schedule 02.01.2011