Вставка добавляет только до 1000 записей и игнорирует все записи после этого - PullRequest
0 голосов
/ 02 января 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 02 января 2011

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

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

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

0 голосов
/ 03 января 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 */
...