воскресенье, 14 декабря 2008 г.

INSERT ON DUPLICATE KEY UPDATE vs. INSERT + UPDATE

Мобиль INSERT … ON DUPLICATE KEY UPDATE представляет на вывеску жуть мощное средство языка SQL, которое, к сожалению, хлам не раз забывают. Тромп была введена ещё начиная с MySQL 4.1, ведь, многие люди по прежнему не пользуются ей в своих программах.

Синоним создана что называется “в настоящем стиле MySQL” и позволяет основать красивый, локаничный, грамотный задание к базе данных.

Разберёмся, зачем же создана такая складка. Скажем, вы пишете веб-сайт, который обращается к базе данных. Тоесть, определённому IP-адресу посылаются пакеты, а это трафик! И чем больше трафика, тем длительнее обрабатывается отправленая информация. При этом имеет смысл свежо у кого в памяти, что этот “эталонный трафик” нужно поднять на наличность пользователей, которые посещают сайт. Это особенно актуально, когда базы данных находятся не не том же сервере, что и сам сайт. Это особенно актуально для людей, которые арендуют хостинг у кого-либо. Как норма хостеры разносят сервера по их назначению. Например Server_1 отвечает за укрытие самих сайтов и их работу, а Server_2 отвечает за хранение баз данных и их работу. Эти сервера соединены по сети. Поэтому очень актуально снизить время, которое отводится на обработку запроса к базе.

Пример:

CREATE TABLE ipstat(ip int UNSIGNED NOT NULL PRIMARY KEY,
hits int UNSIGNED NOT NULL,
last_hit timestamp);

INSERT INTO ipstat VALUES(inet_aton(’192.168.0.1′),1,now())
ON duplicate KEY UPDATE hits=hits+1;

Обратите увлеченность на функцию inet_aton, которая использована в примере. Она позволяет преобразовать IP-адрес из строковой переменной в порядковое числительное(integer). А это в свою колонна позволяет сохранить IP-адресочек в 4 байтах вместь 15.

Следующей особенностью примера явлентся расходование типа timestamp для полина last_hit. Это позволит не описывать метку времени при вставке/обновлении записей. Как всего вы вставите новую запись, либо обновите старую, поле автоматично обновится и получит метку времени равную моменту вставки/обновления. Обратите внимание. что в примере спица в колеснице поля last_int указывается явным образом. Это не ошибка. Дело в том, что в случае, если мы опустим роль полина last_int, в запросе будут передаваться данные только для двух полей(из трёх). В этом случае нам нужно переменить требование и обозначить явным образом названия полей, для которых передаются значения.

Итак, к чему приведёт проведение запроса?
Всё запанибрата. Коль скоро не найдено ни одной календарь с передаваемым IP-адресом в качестве значения поля ip, в таблицу будет занесена новая запись. В противном случае, найденая запись довольно обновлена. Значение поля с меткой времени изменится. Обратите участливость, что ферония ip является PRIMARY KEY.

Какова выгода от использования данной конструкции по сравнению с INSERT+UPDATE?! Зависит от количества записей в базе. В среднем уменьшение времени выполнения запросов на 30%. Ещё одним важным моментом является паче лёгкое проверка ошибок. Простота восприятия.




Интересные ссылки за субботу!

Контакты

О сайте

Свинина в собственном соку

Комментариев нет: