Вложенные транзакции в PDO
В PDO есть такая особенность: отсутствие поддержки вложенных транзакций.
Вложенные транзакции бывают весьма полезны: например, у нас есть два сервиса, которые могут взаимодействовать между собой. Сервис А начинает транзакцию, что-то делает, затем вызывает сервис Б, затем подтверждает транзакцию.
Может так случиться, что сервисы А и Б разрабатываются разными людьми и разработчик сервиса Б может не знать, что сервис А уже начал выполнение транзакции. Как следствие, при использовании PDO как только сервис Б попытается начать транзакцию, PDO выбросит исключение, предупреждающее о наличии активной транзакции.
Тем не менее, такие СУБД как MySQL и PostgreSQL поддерживают вложенные транзакции (о чём PDO не знает). Поэтому было бы неплохо добавить поддержку вложенных транзакций для данных СУБД в PDO. Далее »
Автор: Vladimir, опубликовано в: PHP, комментариев: 4Авг
2011
Блокировки транзакций InnoDB при удалении данных из таблицы
Ситуация: есть несколько физических почтовых серверов (PowerMTA), отсылающих более четырёх миллионов сообщений в сутки. Есть виртуальный сервер базы данных (причём не очень мощный), на котором крутится MySQL с InnoDB; в базу данных пишутся логи доставки/не доставки сообщений и ведётся статистика по IP-адресам, VMTA и доменам. Попутно выполняется классификация и анализ hard и soft bounces. База за день увеличивается примерно на 5 гигабайт. Часть логов недельной давности удаляется. Далее »
Автор: Vladimir, опубликовано в: MySQL, комментариев: 2Фев
2011
Дельта-бэкапы баз данных
На одном из серверов с большим числом пользователей у нас настроено автоматическое создание резервных копий баз данных — четыре раза в день. Стоит отметить, что размер сжатых резервных копий всех баз данных превышает 400 мегабайт. Таким образом, за один день на резервные копии баз данных уходит около двух гигабайт дискового пространства. Две недели — почти 30 гигабайт. Расточительство.
Для экономии места мы изобрели велосипед под названием «дельта-бэкап» (известный как разностный бэкап, differential backup) — мы храним одну полную резервную копию базы данных и список изменений.
Ввиду того, что клиентские сайты используют WordPress, разностное резервное копирование баз данных позволяет сэкономить очень много дискового пространства. Далее »
Автор: Vladimir, опубликовано в: Linux, комментариев: нетСен
2010
Небуферизованные запросы: снижаем потребление памяти WordPress
Пиковое потребление оперативной памяти WordPress можно снизить приблизительно два раза и практически бесплатно. В чём секрет? В использовании правильных функций для работы с базой данных.
Опытные программисты знают, что API MySQL предоставляет два варианта работы с результатом запроса:
- Последовательная обработка результата — при этом не происходит никакой буферизации результата, данные отдаются от сервера клиенту, минуя временные таблицы и буфера. В этом случае обработка результатов может производиться только последовательно.
- Буферирование результата запроса — результат полностью читается во временный буфер, что позволяет осуществлять произвольный доступ к результату.
Сен
2010
Исправление ошибки в INSERT INTO … SELECT в Kohana 3 при использовании конфигурации базы данных, отличной от default
Ситуация: нужно выполнить запрос вида
Если использовать конфигурацию default, то всё отлично работает. Если же использовать другую конфигурацию, то можем получить ошибку соединения с базой данных и исключение. Далее »
Авг
2010
Поддержка JOIN в запросах DELETE для Kohana 3
Иногда бывает полезно выполнить удаление записей в нескольких связанных таблицах, благо синтаксис позволяет. Разумеется, есть такая вещь как каскадное удаление записей, но в случае с MySQL (а именно — таблицами MyISAM) на неё надеяться не приходится.
Модуль Database из Kohana 3 не умеет использовать JOIN с операцией DELETE. Нужно ему помочь. Далее »
Автор: Wandering Soul, опубликовано в: Kohana, комментариев: нетАвг
2010
SQLMon для Code Igniter
На днях мне довелось заняться оптимизацией одного проекта, написанного с использованием фреймворка Code Igniter. Важной частью процесса являлась оптимизация запросов к базе данных, а для этого как минимум нужно видеть эти запросы перед глазами.
Этот минимум в Code Igniter достигается очень просто: вызовом
в контроллере. Но когда запросов на странице очень много, хотелось бы избавиться от рутинного выполнения EXPLAIN для каждого подозрительного запроса. Что, собственно, и делает SQLMon. Возникает логичное желание интегрировать его в Code Igniter. Далее »
Фев
2010
SQLMon для Kohana 3
Продолжая славную традицию реализации SQLMon под различные CMS/фреймворки, написал одному заказчику модуль для Kohana 3.
SQLMon для Kohana 3 интегрируется в иерархию классов Database (встраивается между классами Database_MySQL и Kohana_Database_MySQL) и реализует обёртку над методом Kohana_Database_MySQL::query(), измеряя время выполнения запроса, объём потребляемой памяти, записывая код ошибки запроса, трассу вызовов и EXPLAIN запроса (причём не только для SELECT, но и UPDATE/DELETE и INSERT/REPLACE INTO … AS или CREATE TABLE … AS) — всё то же самое, что и SQLMon для WordPress. Далее »
Фев
2010
Ужасы таксономии в WordPress
Внутренняя реализация управления таксономиями в WordPress — это просто кошмар какой-то. Мало того, что код написан в процедурном стиле (использование ООП помогло бы решить некоторые проблемы с производительностью, которые иначе можно решить только глобальными переменными), он к тому же очень плохо масштабируется.
Я взял свежую дефолтную инсталляцию WordPress 2.8-bleeding, сгенерировал тестовый контент и пошел искать недоработки и проблемы с производительностью. Одну из них я нашел очень быстро: при попытке удалить категорию, в которой была 1,001 ночь запись.
На неслабом сервере это заняло около 20 секунд и… более 12,000 запросов (да-да, двенадцати тысяч, я количеством ноликов, увы, не ошибся). Далее »
Автор: Vladimir, опубликовано в: WordPress, комментариев: 16Июн
2009
Увеличение производительности плагина NextGen Gallery
В случае, если галереи содержат несколько тысяч изображений, в зависимости от мощности сервера и посещаемости сайта могут возникнуть проблемы с производительностью, связанные с неоптимальностью индексов в таблице wp_ngg_pictures. Далее »
Июн
2009

Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.

