Предложение SQL для оптимизации запросов UPDATE? - PullRequest
1 голос
/ 05 февраля 2010

В моей вымышленной базе данных у меня есть несколько столбцов данных. При разработке PHP-интерфейса к сценарию необходимо было разрешить пользователю изменять все атрибуты кортежа, если это необходимо.

Если конечный пользователь в конечном итоге изменяет только один атрибут вместо всех, следующий оператор:

UPDATE foo 
   SET name='bar' location='YYZ' drink='ale' 
 where user='smithj'`

Обновит все три атрибута кортежа "smithj", даже если два атрибута одинаковы.

Есть ли способ, чтобы SQL (MySQL, если это имеет значение) автоматически отфильтровывал избыточные обновления, аналогично предложению IF EXISTS в CREATE TABLE IF EXISTS?

Спасибо!

Ответы [ 5 ]

1 голос
/ 05 февраля 2010

"Если вы установите для столбца значение, которое он имеет в данный момент, MySQL заметит это и не обновит его."

http://dev.mysql.com/doc/refman/5.0/en/update.html

1 голос
/ 05 февраля 2010

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

Проверка того, что обновить, скорее всего, будет стоить дороже.

1 голос
/ 05 февраля 2010

Первый вопрос, на который нужно ответить, почему?

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

  • перемещение данных между вашим приложением и базой данных. Вы можете уменьшить это, включив только те столбцы в операторе обновления, которые действительно нуждаются в обновлении. Но это большая работа, и, вероятно, она того не стоит, когда мы говорим о трех колонках. Также обратите внимание, что большое количество различных создаваемых операторов SQL может убить внутреннее кэширование базы данных. Я не знаю, правда ли это для MySQL, но для оракула. (при условии, что вы используете переменные связывания (что вам следует))

  • и фактически манипулирует данными в базе данных. Но на этом этапе поиск записи для обновления (предложение where) обходится гораздо дороже, чем ее обновление. И я думаю, что это причина того, что нет никакой функции, которая поворачивает обновление, когда старые и новые значения фактически совпадают

0 голосов
/ 05 февраля 2010

В соответствии с тем, что предложила Санни, вы должны параметризовать свой запрос.

Один из вариантов может быть таким (в псевдокоде высокого уровня): Когда пользователь редактирует элемент (скажем, на keyPress), вы можете пометить эту ячейку. Вы можете получить значение из каждой отмеченной ячейки и передать только их значения в параметризованный запрос.

Однако, как это ни печально, если у вас нет большого количества строк, это не должно сильно влиять на вашу производительность.

0 голосов
/ 05 февраля 2010

Вы должны сделать это в своем коде. В любом случае, предоставленный вами «пример» запроса кричит о SQL-инъекции :)

Используйте параметризованные запросы, создавайте их на лету и добавляйте только те элементы, которые хотите обновить.

...