Pull to refresh

ActiveRecord vs DAO – Тест потребления памяти и скорости выполнения запросов

Арнион corporate blogIT systems testing
Recovery mode
В процессе роста и развития проекта «АвтоОфис — Прием платежей и полная автоматизация продаж» мы столкнулись с тем, что при появлении клиентов имеющих у себя в базах более 100 000+ контактов, одна из основных функций, отвечающих за создания и отправку массовых email-рассылок по базе клиентов данных интернет-магазинов стала безбожно тормозить.

Покопавшись в коде, было выявлено, что при выборках данных, насчитывающих 100 000+ записей из таблиц MySQL с использованием класса ActiveRecord, сильно увеличивается потребление оперативной памяти и времени отработки скриптов. Доходило до того, что одна переменная, хранящая в себе результат выборки из 100 000 записей, потребляла 644 750 972 байт (614 Мб) оперативки, а время выполнения скрипта превышало 50 секунд.

Т.к. 100 000 записей, это мягко говоря, не предел мечтаний, и количество клиентов сервиса АвтоОфис уже давно исчисляется тысячами, мы не могли оставить данную проблему без внимания и не принять меры по её устранению. В итоге описанная выше функция была полностью переписана на выборки с использованием широко известного DAO, что существенно снизило расход ресурсов и увеличило скорость выполнения скрипта.

В процессе перехода наши программисты не поленились и сделали несколько тестов, наглядно показывающие сравнительные характеристики использования ActiveRecord и DAO при попытке выборки из БД MySQL 1, 5, 10, 50, 100, 500, 1 000, 5 000, 10 000, 50 000 и 100 000 записей. С результатами данных тестов и предлагаю Вам ознакомиться прямо сейчас.

Сразу оговорюсь, что при проведение схожих тестов на вашем проекте цифры могут немного отличаться, т.к. мне неизвестно, какими компьютерными мощностями вы располагаете, какие данные вы выбираете из БД, и какие средства для измерения показателей вы будете использовать.

В моем случае для замера потребления оперативной памяти и подсчета времени отработки скриптов использовались стандартные PHP функции:

  • time() — Возвращает количество секунд, прошедших с начала Эпохи Unix (The Unix Epoch, 1 января 1970, 00:00:00 GMT) до текущего времени.
  • memory_get_usage() — Возвращает количество памяти в байтах, которое было выделено PHP скрипту на на данный момент

Цель данной статьи показать динамику изменения количества потребляемых ресурсов и времени затрачиваемом на выполнения скриптов при использовании ActiveRecord и DAO.

И так для начала сводная таблица показывающая рост потребления ресурсов и времени выполнения скриптов использующих для обращения к БД MySQL:


Важно понимать, что в данной таблице время выполнения 0 сек. означает, что было затрачено на получение данных и сохранения результата в переменную менее 1 секунды.
Теперь посмотрим на динамику роста потребления оперативной памяти в зависимости от увеличения числа возвращаемых строк с данными из БД MySQL:



Как видно из графика существенные изменения при использовании обоих подходов начинаются, только если в результат выборки входит более 1 000 строк. Но, показатели потребления оперативной памяти при использовании DAO значительно меньше, чем при использовании ActiveRecord. И пиковых показателях DAO потребляет в 5,91 раз меньше ресурсов, чем ActiveRecord.

Конечно, некоторые «специалисты» могут сказать, что учитывая непрерывное снижение стоимости железа (физической и оперативной памяти), а так же непрерывный рост максимально доступной мощности серверов, можно данную проблему решить, просто докупив побольше железа. Но, глядя на динамику роста потребления ресурсов, можно заметить, что начиная от 1 000 записей рост потребления ресурсов становится практически линейным, т.е. если 100 000 записей потребляют 614 Мб. оперативки, то 1 000 000 записей, по самым скромным подсчетам будет требовать 6 140 Мб. (6 Гб.)

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



Вот здесь уже все гораздо интересней!

Количество возвращаемых значений при использовании DAO практически не влияет на время выполнения скрипта. На всех этапах тестирования данный показатель не превысил 1 секунды.

А вот ActiveRecord повел себя почти, так же как и с потреблением ресурсов. На получение результата в 100 000 записей из БД MySQL ему понадобилось 52 секунды, что совершенно не приемлемо для серьезного интернет проекта. Ни один здравомыслящий пользователь вашего интернет-ресурса не будет ждать так долго загрузки страницы с нужно ему информацией (конечно при условии, что вы не монополист в своей нише).

Как итог, хочется сказать следующее:

Мне очень нравиться работать с ActiveRecord. Он удобен и очень хорошо подходит для решения целой группы задач, не требующих получения больших объемов данных. Но, если вы работаете с большими массивами данных, если ваши запросы должны возвращать более 1 000 записей, то лучше сразу для построения запросов и получения результатов выборки использовать что-то другое, например многими любимое DAO или еще более крутые решения.

Если у Вас появились вопросы ко мне или вы хотите поделиться своим опытом по осуществлению больших выборок из БД MySQL, то пишите в комментариях, буду крайне признателен за ценный контент.
Tags:activerecorddaoтесты
Hubs: Арнион corporate blog IT systems testing
Total votes 29: ↑9 and ↓20 -11
Views6.2K

Information

Founded
Location
Россия
Website
autoweboffice.com
Employees
11–30 employees
Registered