Потребовалось мне для одного проекта определиться с выбором СУБД для хранения данных. Предполагаемая структура БД крайне примитивна, но существует требование высокой производительности не только на извлечение данных, но и на их запись, т.к. по первым прикидкам запись в базу будет производиться не намного реже, чем чтение из нее.
Ввиду отсутствия хоть какого-бы опыта применения баз данных на реальных задачах, было принято решение взять MySQL, PostgreSQL и SQLite и потестировать скорость интересующих меня операций.
В каждом случае была заведена таблица из трех колонок: целочисленный id, являющийся первичным ключом и трех строк по 180 символов.
Тестировались:
- скорость добавления одной отдельной записи в базу;
- скорость извлечения одной записи из базы;
- и скорость обновления записи.
Меня интересуют скорости операций с отдельными записями, т.к. предполагается что БД будет использоваться именно в таком режиме.
Для тестирования использовался перл-скрипт, производящий все операции и засекающий время их исполнения
Результаты. В таблице указано количество операций в секунду:
insert | select | update | |
---|---|---|---|
MySQL InnoDB | 45 | 4989 | 42 |
MySQL MyISAM | 9774 | 5109 | 9539 |
PostgreSQL | 1223 | 1789 | 1181 |
SQLite | 12 | 7590 | 12 |
Скрипт запускался несколько раз, указаны скорости, близкие к средним. 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'е показала такие результаты:
insert | select | update | |
---|---|---|---|
MySQL InnoDB | 890 | 1891 | 690 |
MySQL MyISAM | 3162 | 1861 | 2995 |
SQLite | 158 | 2997 | 201 |
Компьютер с линуксом не первой свежести (Sempron 2800, 512 МБ памяти), этим, вероятно, объясняется снижение производительности MyISAM и других вариантов на чтение
На третьем компьютере с 32-битной вистой и конфигурацией, аналогичной первому компьютеру, результаты были таковы:
insert | select | update | |
---|---|---|---|
MySQL InnoDB | 379 | 5793 | 432 |
MySQL MyISAM | 9145 | 5783 | 9641 |
SQLite | 34 | 6903 | 74 |