Каков самый быстрый способ опроса таблицы MySQL для новых строк?

Мое приложение должно опросить базу данных MySQL для новых строк. Каждый раз, когда новые строки добавляются, их следует извлекать. Я думал создать триггер для размещения ссылок на новые строки в отдельной таблице. Исходная таблица имеет более 300 000 строк.

Приложение построено на PHP.

Некоторые хорошие ответы, я думаю, этот вопрос заслуживает щедрости.

Solutions Collecting From Web of "Каков самый быстрый способ опроса таблицы MySQL для новых строк?"

Для внешних приложений я считаю, что использование столбца TimeStamp – это более надежный метод, который не зависит от автоматического идентификатора и других проблем с первичным ключом

Добавьте столбцы в таблицы, такие как:

insertedOn TIMESTAMP DEFAULT CURRENT_TIMESTAMP 

или отслеживать вставки и обновления

 updatedOn TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

Во внешнем приложении все, что вам нужно сделать, это отслеживать последнюю метку времени, когда вы проводили опрос. Затем выберите из этой временной метки все соответствующие таблицы. В больших таблицах вам может потребоваться индексировать столбец временной метки

Вы можете использовать следующий оператор, чтобы узнать, была ли новая запись вставлена ​​в таблицу:

 select max(id) from table_name 

заменяя имя первичного ключа и имени таблицы в приведенном выше описании. Храните значение max (id) во временной переменной и извлекайте все новые записи между этим и последним сохраненным значением max (id). После извлечения новых записей установите максимальное (id) значение в том, которое вы получили от запроса.

Создайте PHP-демон для контроля размера таблицы MySQL, если размер изменяет запрос на новые записи, если обнаружены новые записи, выполните следующий процесс.

Я думаю, что есть активный демон PEAR, который вы можете легко настроить для контроля размера файла таблицы MySQL и запуска своего сценария.

предполагая, что у вас есть идентификатор или некоторые другие данные, которые всегда растут, вам следует отслеживать ваше приложение php из последнего найденного идентификатора.

это будет работать для большинства сценариев. Если вы не в лагере в реальном времени, я не думаю, что вам нужно больше.

Я бы сделал что-то подобное. Конечно, это предполагает, что идентификатор является инкрементирующим числовым идентификатором. И то, как вы сохраняете свое «текущее местоположение» в базе данных, зависит от вас.

 <? $idFile = 'lastID.dat'; if(is_file($idFile)){ $lastSelectedId = (int)file_get_contents($idFile); } else { $lastSelectedId = 0; } $res = mysql_query("select * from table_name where id > {$lastSelectedId}"); while($row = mysql_fetch_assoc($res)){ // Do something with the new rows if($row['id']>$lastSelectedId){ $lastSelectedId = $row['id']; } } file_put_contents($idFile,$lastSelectedId); ?> 

Я бы согласился с ответом TFD на отслеживание отметки времени в отдельном файле / таблице, а затем извлечение всех строк, более новых. Вот как я делаю это для аналогичного приложения.

Ваша заявка, запрашивающая таблицу (или файл) одной строки, чтобы увидеть, изменилась ли временная метка из локального хранилища, не должна сильно влиять на производительность. Затем выборка новых строк из таблицы строк 300k на основе метки времени должна быть в порядке, предполагая, что временная метка правильно проиндексирована.

Однако, читая ваш вопрос, мне было любопытно, могут ли триггеры Mysql выполнять системные вызовы, скажем, скрипт php, который будет делать тяжелый подъем. Оказывается, они могут с помощью пользовательской функции sys_exec () . Вы можете использовать это, чтобы делать все виды обработки, передавая им вставленные данные строки, по существу имея мгновенное уведомление о вставках.

Наконец, предостережение об использовании триггеров для вызова внешних приложений.

Одним из вариантов может быть использование инструкции INSERT INTO SELECT. Взяв из предложений с помощью временных меток, чтобы вытащить последние строки, вы можете сделать что-то вроде …

 INSERT INTO t2 ( SELECT * FROM t1 WHERE createdts > DATE_SUB(NOW(), INTERVAL 1 HOUR) ); 

Это займет все строки, вставленные в предыдущий час, и вставьте их в таблицу 2. Вы могли бы запустить сценарий этого запроса и запустить его каждый час (или любой необходимый вам интервал).

Это существенно упростило бы ваш PHP-скрипт для вытягивания строк, поскольку вам не нужно было бы перебирать любые строки. Он также избавляется от необходимости отслеживать последний идентификатор вставки.

Решение Fanis также звучит так, как будто это может быть интересно.

В качестве примечания, запрос выбора в приведенной выше вставке может быть скорректирован только для вставки определенных полей. Если вам нужны только определенные поля, вам нужно будет указать их во вставке так …

 INSERT INTO t2 (field1, field2) ( SELECT field1, field2 FROM t1 WHERE createdts > DATE_SUB(NOW(), INTERVAL 1 HOUR) );