Недостатки Postgres

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
Есть ли у Postgres недостатки по сравнению с MySQL (innodb) ?
Каких подводных камней ждать?
 

MiksIr

miksir@home:~$
Большинство вещей умеет пгадмин.
Если этого не хватает, ибо создаете серьезные базы, то EMS SQL Management Studio
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
pg в среднем немного медленнее, нет ряда mysql-only фичей
 

MiksIr

miksir@home:~$
А в среднем - это как? Раньше считалось, вообще-то, что pg на многопроцессорных конфигах работает ощутимо быстрее, проигрывая на одном ядре. MySQL подтянулось?
 

fixxxer

К.О.
Партнер клуба
Давно уже.

А вообще сравнивать производительность в отрыве от конкретного кейса и конкретных настроек - это глупость. Все зависит от миллиона нюансов.

Постгрес лучше мыскля отсутствием неожиданных нюансов и предсказуемостью.

В мыскле - ммм. Ну в нем upsert-ы есть. Чем он еще на данный момент лучше хз. Касаемо производительности все зависит от рук на 99.9%. Если хорошо знаешь, в какую дырку подоткнуть мыскль, а постгрес видишь первый раз, смысла менять базу конечно нет.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
А вообще сравнивать производительность в отрыве от конкретного кейса и конкретных настроек - это глупость. Все зависит от миллиона нюансов.
Ну вот хочется узнать хотя бы пару мест, где mysql существенно производительнее постгреса, при условии, что обе базы тюнили профессионалы. Какие кейсы так сказать. Чтобы заранее знать подводные камни.

В мыскле - ммм. Ну в нем upsert-ы есть.
Да, это удобно. Мутить что-то через триггеры - это хуже.

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

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
Насколько я знаю, mysql должен быстрее отрабатывать в запросах поиска по первичному ключу, потому что innodb индекс-ориентированно хранит данные. Но по ключу любая база неплохо справляется, это не существенно
 

fixxxer

К.О.
Партнер клуба
Да не знаю что не так с инструментами. Мне навиката хватает более чем. Он конечно специфический, но привыкаешь быстро. Ну и 80% работы - то есть "пара запросов по мелочи" - все равно в консоли делаю, так быстрее.

Можно придумать специальные случаи, когда одно будет быстрее другого и наоборот - но это будет называться "не надо так писать".
 

Gas

может по одной?
У pg есть особенность - замедление скорости работы с таблицей в которую делается много апдейтов. Насколько я помню, это связано со способом хранения данных транзакций (могу ошибаться). Vacuum конечно помогает, в новых версиях и auto vacuum уже есть, хотя не все его используют, потому что вроде может включиться в неудобный момент.

Про upsert-ы уже писали. В целом, это единственные неудобства с которыми лично я столкнулся, но опыта с pg у меня мало.
Ещё в mysql есть нативный partitioning (в pg это можно на хранимых продцедурах сделать) и сомнительная фича event scheduler.
 

Dovg

Продвинутый новичок
У pg нет автоинкрементов, в место них sequence, что не совсем одно и то же. Не было полноценной репликации до 9.0. Достаточно дорогая инициализация соединения, поэтому многие ставят какой-нибудь прокси между pg и приложением.
Из особенностей:
Большой contrib раздел, есть куча расширений на все случае жизни. Например, мы не так давно для себя открыли ip4r, которые позволяет очень быстро искать по ip и подсетям.
Есть небольшие отличия в синтаксисе.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Ну тут в принципе уже сказали про отсутствие UPSERT'ов, это единственный крупный недостаток, на мой взгляд.

Надо также понимать, что Постгрес очень расширяемый, поэтому если чего-то нет в штатной поставке, можно смотреть контрибы, pgfoundry и т.д. и т.п. Рассказы о том, что "это же не в ядре!11!один!" достаточно смешно слушать от пользователей мыскля, у которых в базе табличные движки меняются, а на каждый чих ответ "подключите sphinx".

Что касается инструментов, для проектирования базы есть, например, powerdesigner, который понимает диалект Постгреса (но он либо пиратский, либо дорогой), это как бэ industry standard. Для обычного администрирования, как ни странно, удобен стандартный консольный psql, за счёт того, что в Постгресе транзакционный DDL:
Код:
begin;
drop table whatever cascade;
-- Постгрес: drop cascades to ...
-- пользователь: ой, бл..
rollback;
-- таблица на месте
 

Ragazzo

TDD interested
Кстати, поскольку заговорили про UPSERT'ы , кто как решает данную проблему? с точки зрения того что код может быть перенесен с легкостью с pgsql на mysql например. пока что нашел это, вариант INSERT+UPDATE двух запросов как-то проще, чем функции специальные
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Кстати, поскольку заговорили про UPSERT'ы , кто как решает данную проблему? с точки зрения того что код может быть перенесен с легкостью с pgsql на mysql например. пока что нашел это, вариант INSERT+UPDATE двух запросов как-то проще, чем функции специальные
Специальные функции, в т.ч. рекомендуемые в официальной документации, в основном нужны как обёртка над постановкой savepoint'а перед insert'ом. Если его не ставить, то возможна ситуация когда update ещё ничего не обновил, а последующий insert уже напоролся на запись, вставленную в параллельной транзакции. При этом текущая транзакция откатится целиком.

В принципе, никто не мешает делать savepoint не в процедурке, а в клиентском коде.
 

Ragazzo

TDD interested
Sad Spirit
мм... а если делать все в одной транзакции то такой проблемы не будет, или я что-то не так понял?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Sad Spirit
мм... а если делать все в одной транзакции то такой проблемы не будет, или я что-то не так понял?
поподробнее:
Код:
begin;
-- много-много операций
update что-то там;
-- если запись изменена - заканчиваем
insert что-то там;
-- перед этим insert'ом могла быть в параллельной транзакции вставлена запись
-- если insert вызовет ошибку, то откатится транзакция и откатятся "много-много операций"
commit;
а если перед insert'ом сделать savepoint, то в случае ошибки можно rollback to savepoint и фигачить дальше, "много-много операций" не откатятся.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ну вопрос-то стоит как "недостатки", а не "сравнение" - других недостатков, кроме скорости на некоторых операциях, я и не знаю
 
Сверху