Димон
Новичок
Mysql vs Postges
По работе сейчас делаем выбор базы данных. Обязательно с поддержкой транзакций. С MySQL знакомы хорошо, т.к. давно с ней работаем. Postgres знаем хуже, т.к. работали с ней меньше. Поискав по интернету объективные бенчмарки этих баз, в принципе, ничего путного не нашли, т.к. всегда одна из баз превозносилась над другой по желанию автора. И так решили сами потестить. Сделали первый поверхностные тест.
Платформа: Kubuntu 9.10
MySQL: 5.1.45
Postgres: 8.4
PHP: 5.2.12
Драйвер: PDO
Железо: обычная девелоперская машина (3Ггц, 2Гб ОЗУ)
Для теста создали простые таблицы в обоих базах:
id INT,
name VARCHAR(255),
field_1 INT,
field_2 INT,
id - primary key, остальные поля - key
В mysql, так для интереса прогнали и таблицы типа myisam и heap.
Результаты:
1) Вставка 1 000 000 строк ( здесь INSERT ... VALUES (...) по 10 000 строк ), общее время в сек (меньше - лучше):
Mysql engine=MyIsam ....114.40 sec.
Mysql engine=InnoDB .... 573.16
Mysql engine=Heap ....... 33.04
Postgres ....................... 131.62
2) Apache bench: ab -n 1000 -c 100 http:// ...
Здесь цифры - это кол-во запросов в секунду (больше - лучше).
Кол-во строк в таблицах: 1 000 000.
SELECT * FROM <table> WHERE id = '%s', здесь %s = rand(999000 - 999999):
Mysql engine=MyIsam .... 551.00 requests per sec.
Mysql engine=InnoDB .... 559.03
Mysql engine=Heap ....... 545.26
Postgres ....................... 56.54
UPDATE <table> SET field_1 = '%s' WHERE id = '%s'
Mysql engine=MyIsam ....445.61 requests per sec.
Mysql engine=InnoDB .... 72.18
Mysql engine=Heap ....... 480.61
Postgres ....................... 52.22
Что получилось:
Получилось что по первому тесту Postgres существенно обогнала транзакционные таблицы MySQL. Это хорошо.
А вот во втором тесте селект из таблицы оказался в 10 раз медленней чем у MySQL. Это очень странно, т.к. селект выполняется по primary key. Здесь id намеренно берется из конечного диапазона близкого к 1 000 000, чтобы увеличить время поиска.
Кто что думает по этому поводу? Очень заманчивая скорость инсертов у постгрес, но селект ни в какие ворота не лезет. Возможно постгрес надо где-то подкрутить? Да, еще у постгрес есть очень важная фича - это язык хранимок plpgsql, который намного мощнее языка хранимок в MySQL. А это очень весомый аргумент в пользу выбора.
По работе сейчас делаем выбор базы данных. Обязательно с поддержкой транзакций. С MySQL знакомы хорошо, т.к. давно с ней работаем. Postgres знаем хуже, т.к. работали с ней меньше. Поискав по интернету объективные бенчмарки этих баз, в принципе, ничего путного не нашли, т.к. всегда одна из баз превозносилась над другой по желанию автора. И так решили сами потестить. Сделали первый поверхностные тест.
Платформа: Kubuntu 9.10
MySQL: 5.1.45
Postgres: 8.4
PHP: 5.2.12
Драйвер: PDO
Железо: обычная девелоперская машина (3Ггц, 2Гб ОЗУ)
Для теста создали простые таблицы в обоих базах:
id INT,
name VARCHAR(255),
field_1 INT,
field_2 INT,
id - primary key, остальные поля - key
В mysql, так для интереса прогнали и таблицы типа myisam и heap.
Результаты:
1) Вставка 1 000 000 строк ( здесь INSERT ... VALUES (...) по 10 000 строк ), общее время в сек (меньше - лучше):
Mysql engine=MyIsam ....114.40 sec.
Mysql engine=InnoDB .... 573.16
Mysql engine=Heap ....... 33.04
Postgres ....................... 131.62
2) Apache bench: ab -n 1000 -c 100 http:// ...
Здесь цифры - это кол-во запросов в секунду (больше - лучше).
Кол-во строк в таблицах: 1 000 000.
SELECT * FROM <table> WHERE id = '%s', здесь %s = rand(999000 - 999999):
Mysql engine=MyIsam .... 551.00 requests per sec.
Mysql engine=InnoDB .... 559.03
Mysql engine=Heap ....... 545.26
Postgres ....................... 56.54
UPDATE <table> SET field_1 = '%s' WHERE id = '%s'
Mysql engine=MyIsam ....445.61 requests per sec.
Mysql engine=InnoDB .... 72.18
Mysql engine=Heap ....... 480.61
Postgres ....................... 52.22
Что получилось:
Получилось что по первому тесту Postgres существенно обогнала транзакционные таблицы MySQL. Это хорошо.
А вот во втором тесте селект из таблицы оказался в 10 раз медленней чем у MySQL. Это очень странно, т.к. селект выполняется по primary key. Здесь id намеренно берется из конечного диапазона близкого к 1 000 000, чтобы увеличить время поиска.
Кто что думает по этому поводу? Очень заманчивая скорость инсертов у постгрес, но селект ни в какие ворота не лезет. Возможно постгрес надо где-то подкрутить? Да, еще у постгрес есть очень важная фича - это язык хранимок plpgsql, который намного мощнее языка хранимок в MySQL. А это очень весомый аргумент в пользу выбора.