11 окт. 2009 г.

Про базы данных

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


Ввиду отсутствия хоть какого-бы опыта применения баз данных на реальных задачах, было принято решение взять MySQL, PostgreSQL и SQLite и потестировать скорость интересующих меня операций.


В каждом случае была заведена таблица из трех колонок: целочисленный id, являющийся первичным ключом и трех строк по 180 символов.


Тестировались:


  1. скорость добавления одной отдельной записи в базу;

  2. скорость извлечения одной записи из базы;

  3. и скорость обновления записи.



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


Для тестирования использовался перл-скрипт, производящий все операции и засекающий время их исполнения


Результаты. В таблице указано количество операций в секунду:


insertselectupdate
MySQL InnoDB45498942
MySQL MyISAM977451099539
PostgreSQL122317891181
SQLite12759012

Скрипт запускался несколько раз, указаны скорости, близкие к средним. MyISAM не поддерживает транзакций и тестировался просто для сравнения.


Результаты меня весьма удивили, такой низкой скорости записи я не ожидал. В ближайшее время я попытаюсь перепроверить результаты на другом компьютере.


Использовались следующие версии ПО:


  • MySQL 5.1.39 x64

  • PostgreSQL 8.4.1 x86

  • SQLite, шедший в комплекте с ActivePerl 5.10.1 x64


Тестировалось все на Windows Vista x64, на компьютере с процессором Core 2 6750 2.66 ГГц, 2 ГБ памяти.


Update: Проверка на Linux'е показала такие результаты:

insertselectupdate
MySQL InnoDB8901891690
MySQL MyISAM316218612995
SQLite1582997201

Компьютер с линуксом не первой свежести (Sempron 2800, 512 МБ памяти), этим, вероятно, объясняется снижение производительности MyISAM и других вариантов на чтение

На третьем компьютере с 32-битной вистой и конфигурацией, аналогичной первому компьютеру, результаты были таковы:

insertselectupdate
MySQL InnoDB3795793432
MySQL MyISAM914557839641
SQLite34690374