Мобиль 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%. Ещё одним важным моментом является паче лёгкое проверка ошибок. Простота восприятия.
Интересные ссылки за субботу!
Контакты
О сайте
Свинина в собственном соку
Комментариев нет:
Отправить комментарий