2011-11-23 2 views
1

Я столкнулся с программным обеспечением PHP, которое обновляет потоки каждый час.
Таким образом, каждый раз, когда вы просматриваете поток, строка вставляется в таблицу потоков с идентификатором потока, тогда сценарий запускается один раз в час и обновляет фактическое количество просмотров в таблице потоков.UPDATE значительно эффективнее, чем INSERT?

Мой вопрос в том, какова логика этого? Почему бы просто не обновить таблицу потоков (т. Е. Views = views + 1)?

+0

Возможно, это должно быть сделано для того, чтобы избежать блокировки строки нити для каждого чтения и, таким образом, избежать наличия точки конкуренции только для чтения. –

ответ

4

обновления, в общем, медленнее, чем вставки, вы можете придумать обновление как удаление и вставку. обновлениям может потребоваться блокировка для поддержки соответствия ACID СУБД, с вставками, которые у вас нет блокировки.

Кроме того, из-за параллелизма вы не хотите блокировать строку и ждать завершения обновления, подумайте об этом, что произойдет, пока вы обновляете, вы получаете нового посетителя, вы потеряете этого посетителя. Это называется утерянным обновлением. С другой стороны, задание cron агрегирует посещения и обновления раз в час, так как эта строка только для чтения, блокировка записи не влияет на ваши чтения во время обновления.

+0

Ну, но из того, что я вижу, это не так много медленнее. Я имею в виду, это может быть несколько раз медленнее, но разве это не незначительная потеря производительности, так как время выполнения запроса так быстро? – Lior

+0

он не чувствует себя медленнее с небольшими данными, как только ваши данные станут большими, и у вас слишком много посетителей, тогда вы почувствуете разницу, и вы столкнетесь с проблемами параллелизма. см. мое обновление. – DarthVader

0

Вставка, вероятно, всегда быстрее. Посмотрите на это так.

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

Вставка такая же без поиска. Это также всегда одна строка (или она может быть больше, но на самом деле это больше, чем одна вставка ...), которая должна быть проверена на наличие ограничений и индексов обновления.