Производительность MySQL: вложенный ключ вставки / дублирования против нескольких обновлений - PullRequest
3 голосов
/ 20 сентября 2010

Кто-нибудь знает, что было бы более эффективно и использовало бы меньше ресурсов:

Метод 1 - Использование одного оператора SELECT для получения данных из одной таблицы, а затем итерация по ней для выполнениянесколько обновлений на другой таблице.EG (псевдокод, execute () выполняет запрос):

Query1_resultset = execute("SELECT item_id, sum(views) as view_count FROM tableA WHERE condition=1");  
while(Query1_resultset as row) {  
   execute("UPDATE tableB SET view_count=row.view_count WHERE id=row.item_id");  
}

Метод 2 - использовать один оператор INSERT .. ON DUPLICATE KEY UPDATE с вложенным оператором SELECT.EG:

INSERT INTO tableB (id, view_count) SELECT item_id, SUM(views) as view_count FROM tableA WHERE condition=1 ON DUPLICATE KEY UPDATE view_count=VALUES(view_count);

Примечание. Идентификатор в таблице B является первичным ключом.Там на самом деле не будет никаких вставок, потому что я знаю, что ключ будет существовать.Так что это все ОБНОВЛЕНИЯ.Просто с помощью этого оператора, чтобы передать один запрос, а не несколько.

Мне действительно любопытно, почему любой из них будет более эффективным.Количество запросов определяет, насколько быстро он будет выполняться?Где узкое место?Я ищу что-то, что будет масштабироваться (число обновляемых строк растет с каждым днем).

Есть идеи?

Спасибо

Ответы [ 2 ]

2 голосов
/ 20 сентября 2010

Это зависит от вашего соотношения обновления / вставки. Если у вас много вставок и только пара обновлений, оператор INSERT ... ON DUPLICATE KEY UPDATE будет быстрее.

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

0 голосов
/ 20 сентября 2010

Я думаю, INSERT.. ON DUPLICATE KEY UPDATE более эффективен (иначе было бы бессмысленно добавлять такое расширение). Кстати, ваш первый пример не совсем совпадает со вторым - вы не используете транзакции и не блокируете таблицу, поэтому возможно, что запись, возвращенная SELECT, не будет существовать к тому времени, когда вы выполните UPDATE.

...