Answer the question
In order to leave comments, you need to log in
Is it bad to do update + if there are no updated fields - insert?
Есть таблица statistic, в ней поля date, id_user, browser, count (к примеру).
При этом используется UNIQUE KEY (date, id_user, browser) (поэтому продублировать значение не получится).
Как я делал раньше - SELECT * FROM statistic WHERE date='...', id_user=..., browser='...'; если запись существует - делал UPDATE `count`=`count`+1 WHERE ...; если нет - INSERT
Но, во-первых, из-за этого идет в два раза больше запросов (что не сильно хорошо для производительности), а во-вторых, в начале суток получалась ситуация, что пока я делал INSERT, другой запрос уже успевал сделать запись и я получал Integrity Constraint ошибки.
Но ведь суть таблицы состоит в том, что UPDATE происходят намного чаще, чем insert, а в SELECT вообще нет критичной необходимости.
Можно ли делать сразу UPDATE `count`=`count`+1 WHERE date='...', id_user=..., browser='...'; и смотреть, если нет задействованных строк (количество affected rows равно нулю), после этого делать INSERT?
Это позволит избавиться от миллионов запросов SELECT.
Пока что не нашел, чем этот способ плохой. Подскажите, в чем я ошибаюсь?
Правда, от integrity constraint это меня не избавляет (придется ловить Exception в PHP-коде, но это уже такое дело), но зато избавляет от SELECT'ов.
Подскажите, какие могут быть недостатки в этом подходе и возможно ли существуют решения по-лучше?
//Да, знаю о ON DUPLICATE KEY UPDATE, но это решение исключительно для MySQL, и в MyISAM при партиционировании блокирует таблицу (если я правильно понял из StackOverflow). При 60-80 хитах в секунду - это не лучшее решение, как мне кажется.
Answer the question
In order to leave comments, you need to log in
Зачем выбрали MyISAM если у вас почти всегда запись а не чтение?
Ну вообще по хорошему да, ON DUPLICATE KEY UPDATE, т.к. один запрос явно лучше, чем два (update + insert)
Можно так, как ты описал, а можно INSERT IGNORE и если не было affected rows, тогда UPDATE, это должно избавить от integrity constraint.
Лично я не знаю, чем это может быть плохо.
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question