Комментарии 76
Например запрос «select * from group by col1 order by col2 asc» скушается mysql, но postgres не сможет такое отработать. И если в проекте есть такие вещи они потребуют много рефакторинга.
Для запроса «select f1, f2 from t group by f1» будет так: Postgre ругнётся, а MySQL сгруппирует по f1, и для f2 вернёт первое значение. Поскольку порядок возвращаемых строк неопределён и зависит от стратегии выборки, то может получиться что значение f2 будет разным при разных вызовах, что не очень-то и хорошо.
Я когда-то хорошо знал turbo pascal, мне надо было на нем остановиться навсегда?
В случае с паскалем, все будет не так. То, на чем сейчас приходится писать, от паскаля отличается как небо от земли. И паскаль неконкурентен по сравнению с актуальными языками, и специалистов по нему мало, то есть — явный аутсайдер = хорошо, что не стали останавливаться.
Я использовал PG в паре проектов, потом вернулся к мускулю, потому что команда на новый прожект уж совсем его не захотела. То есть, можно и то, и то. Но вот смысла — не вижу. Оборачиваясь назад, те проекты, которые были сделаны на PG, абсолютно так же отработали бы и на мускуле. Только головняка в процессе было бы меньше.
Ведь если разница не такая масштабная, как вы утверждаете, то реализовать это будет просто. Но при этом, я думаю, было бы логично, если бы всю эту мелкую дурную работу за человека делала бы машина, а человек уже мог бы, перейдя на Postgres и оценив все его преимущества, уже писал бы новые запросы в postgres-стиле.
Подобный инструмент точно бы помог популяризации постгри в интернетах.
Действительно, БД развивается немыслимыми темпами.
Что и говорить.
Им потребовались годы, чтобы сделать это.
Если учить, то про MySQL куча понятных книжек, в том числе и на русском. Плюс инструменты. Плюс даже настройки по-умолчанию в половине случаев прокатывают. Ну и не забываем про то что 5.0 и 5.5 это две большие разницы.
Вот и получается что массовой миграции не предвидеться. Такие дела.
Из плюсов такого перехода:
— Выросла скорость не некоторых сложных запросах в разы, в среднем запросы отрабатывают на 20-30 процентов быстрее
— За счёт более строгой валидации данных выловили несколько ошибок, когда данные не умещались в колонку
— Написание миграций стало нормальной работой за счёт транзакционности alter table
Из минусов:
— Иногда возникают неприятные баги из-за строгой валидации (например после перехода бывали падения на неверных utf-8 последовательнотей в user-agent, который пишется в базу)
— В целом качество поддержки софтом чуть ниже, чем для mysql (некритичные проблемы с doctrine / doctrine-migrations)
Пока проект в глубокой альфе, субд не тюнили, просто установили с стандартными настройками и используем. На очень простых выборках — mysql на 20-30% быстрее, более сложные — лидирует postges.
Например, пресловутая ON CONFLICT появилась в только в версии 9.5 (sic!), до этого гуру постгреса искренне верили, что если можно решить задачу хранимочкой на пол страницы, то и так сойдёт. Однако, даже в итоге утверждённый вариант, в попытке сделать универсальное решение на все случаи жизни, получился более многословным и неудобным из-за необходимости явно указывать обязательным параметром имя поля, по сравнению с тем же мускулом, который уже много лет умеет это делать автоматически.
Или например функция lastval() по прихоти разработчиков, вместо того чтобы тихо вернуть null, если в таблице нет автоинкрементного ключа, зачем-то откатывает всю транзакцию, делая невозможным её использование в простых ORM, а в других случаях эта функция по сути и не нужна.
И такие грабли заботливо разложены в постгресе на каждом шагу. Поэтому нет ничего удивительного в том, что разработчики из небольших проектов, которым никто не переплачивает за страдания и боль, в угоду мифической производительности и масштабируемости, которая может понадобится, а может и не понадобится, не горят желанием её использовать.
DO $pgfunc$
BEGIN
BEGIN
INSERT INTO ...;
EXCEPTION WHEN unique_violation THEN
UPDATE ...;
END;
END
$pgfunc$
В том-то и дело, что пока не попробуешь — не поймешь.
Я вот например без CTE и без нормальной работы сложных запросов уже просто как без рук.
К примеру, мы изредка начисляем компенсации пользователям в зависимости от всяких там средних трат за неделю и фазы луны. Раньше, на mysql частенько приходилось делать промежуточные временные таблицы. В пг — просто пишешь километровый запрос на CTE
Действительно, к чему лишний шум? Об ошибках надо молчать.
В то же время мускулом можно начать пользоваться уже сразу после yum install mysql-server; service mysqld start.
И разница тем более заметна, чем менее искушен программист в системном администрировании. Некоторые то и так просят создать им базу, или ребутнуть мускуль.
А так да… в очередной раз подумал — может попробовать въехать в Постгрес опять? А потом — да ну его нафиг…
Очень не хватает краткой шпаргалочки вида: вы привыкли это делать в мускуле вот так — а вот в постргесе вот такие команды.
На первых порах, чтобы просто запустить этого монстра — хватит.
к сожалению вы выбрали дистрибутив, который требует участия администратора в инициализации кластера: https://wiki.postgresql.org/wiki/YUM_Installation
на debian-like после инсталяции будет запущен работоспособный инстанс (хотя и не утверждаю что это правильнее)
Ну и это разве нормально?
кластер например можно инициализировать (а потом это нельзя уже изменить) как с cheksums так и без, конечно у человека должен быть выбор
Но опять таки… сравнивая мускуль и постгрес — один просто поставил и уже используешь. Не задумываясь ни о каких понятиях типа кластера, как его там инициализировать и так далее. А в другой сначала придется въехать, потом использовать.
Не то чтобы сложно… просто когда это не твоя основная задача на текущий момент — очень не хочется отвлекаться.
The pg_hba.conf file is read on start-up and when the main server process receives a SIGHUP signal. If you edit the file on an active system, you will need to signal the postmaster (using pg_ctl reload or kill -HUP) to make it re-read the file.
Если в нем будет разрешено всем все, то да — можно средствами только SQL создать пользователя, доступ у него уже будет.
HBA тут просто как еще один уровень безопасности. В частности с помощью этого механизма пользователь, под которым запущен постгрес на локальной машине с этой же локальной машины может подключаться без ввода пароля через файловый сокет по-умолчанию (во всяком случае, на Debian)
Для себя решил, что HBA — это результат попытки разделить ответственность за безопасность между администраторами БД и сисадминами :). Но вообще говоря, RBAC (Role-based auth system) довольно дорогая штука при DoS атаках, а HBA — очень дешевая. Фактически, HBA — это разновидность файрвола.
А вообще, в большинстве своих проектов не залезал в pg_hba.conf. Где это было необходимо (а это доступ к БД через сеть) сперва все равно лезешь в postgresql.conf добавлять интерфейсы в listen_addresses и полностью перезагружаешь кластер. После чего в pg_hba только подкидываются/убираются сети и пользователи, которым разрешен доступ и делается релоад.
Из Security Best Practices могу рекомендовать погуглить 'postgresql security best practices', первые же две ссылки — документы IBM и OpenSCG на эту тему. И там, и там очень хорошо расписано, что зачем.
Наверное, в MySQL тоже что-то для этого есть.
service reload <name>
Плюс пресловутый тюнинг под производительность. Мускуль на ненагруженных проектах даже из коробки работает неплохо. А как тюнить постгрес — это надо еще въехать.
В итоге в очередной раз разворачивая какое-нибудь приложение из двух движков по привычке выбираешь Мускуль. За простоту и понятность.
Могу попробовать написать. Но что кроме
deb apt.postgresql.org/pub/repos/apt YOUR_DISTRO_VERSION_HERE-pgdg main
wget --quiet -O — www.postgresql.org/media/keys/ACCC4CF8.asc | \
sudo apt-key add — sudo apt-get update
sudo apt-get install postgresql-9.5
вы бы хотели увидеть в такой статье? Даже конфиг по умолчанию позволит поиграть со слоником из коробки (знаю, он убог), а какой-то кастомный postgresql.conf и pg_hba.conf сильно зависят от того, как и на каком оборудовании будет использоваться СУБД.
А меж тем разработчику зачастую уметь создать базу, дать к ней доступ пользователю с паролем, и запустить SQL-консоль с коннектом к этой базе нужно уметь так же часто как и собственно SQL-запросы. Аналогично починить базу, удалить, сделать дамп. Залить из дампа.
Плюс пресловутый тюнинг под производительность. Мускуль на ненагруженных проектах даже из коробки работает неплохо. А как тюнить постгрес — это надо еще въехать.
Т.е. по идее надо какие-то простые вещи, которые у вас может быть и вопросов то не вызывали никогда, но у разработчика будет ступор. По верхам хотя бы.
— как установить
— как прописать в hba что нужно
— как запускать / останвливать
— как создать новую базу
— основные моменты в тюнинге, размер shared_buffers и проч
— как создать роль, чтобы с нее можно было залогиниться
— создать дамп / восстановить из дампа
— фиг знает, что там еще, настроить бекапы? репликацию?
2) Всё после apt-get install можно сделать из графического интерфейса pgAdmin, в котором чтобы непонять где находится запуск SQL-консоли и снятие бэкапа — нужно от души постараться. Если вдруг корпоративный стандарт — это Навикат, то там всё едва ли не еще проще
3) А вы думаете, что люди, которые не могут загнать в гугл поисковый запрос «postgresql tuning guide», хорошо разбираются в тюнинге MySQL?
Вот я вижу фразу, «Мускуль на ненагруженных проектах даже из коробки работает неплохо.»
На основании чего был сделан вывод, что Слоник «на ненагруженных проектах» работает плохо, и его надо тюнить?
Зачем вообще тюнить ненагруженный проект? Т.е. понятно, что стартовые настройки не идеальные, но как это можно понять без нагруженного проекта или нагрузочных тестов?
Поднимите руку, кто считает стартовые настройки MySQL идеальными :))
Вот в мускуле реально три строчки:
# mysql -uroot -p
# CREATE DATABASE 'db_name';
# GRANT ALL PRIVILEGES ON db_name.* TO db_username IDENTIFIED BY 'db_password';
Ни одного файла редактировать не надо. И лишь одна консольная утилита.
2) ОК. Но зачем эти сложности? Если на сервере не предусмотрен даже веб-сервер, например? Это отвлекаться, настраивать. Понимаю что сейчас это проще простого. Но все же… не всегда всё заводится из коробки, как того хочется. В итоге хотел развернуть к примеру Nagios, а обнаружил себя в три часа ночи, собирающим из исходников особенную версию php :) Ну это я так… к примеру.
3) Сколько я проектов повидал, в которых конфиг мускула практически пустой. И оно как-то работало. Пока к ним не пришла популярность :) В том то и дело. Что, чтобы тюнить мускуль зачастую хватает квалификации даже менеджера веб-магазина. Скопировать конфиг из мануала и вставить в файл. В постгресе такое возможно? Будет позитивный эффект? Везде написано: никогда не используйте его в дефолтной конфигурации. Всегда делайте тюнинг под ваш проект. Только нафиг простому программисту в этом разбираться?
Может быть в мире «большой и грамотной» разработки и есть какие-то ДБА. А в том мире где к примеру живу я (и еще многие) есть только веб-программист, и хорошо если еще полуграмотный линукс-админ, который и мускул то не может настроить. А то зачастую есть только директор и программист.
ЗЫ я не считаю настройи мускуля идеальными. и не считаю мускуль идеальным. Но все же продукт в целом выглядит более простым и логичным, чем постгрес. И осваивается легче и быстрее.
sudo -u postgres psql
create role db_user with password '12345' login;
create database blabla owner db_user;
Далее, надо отредактировать pg_hba.conf, в нем например разрешить всем юзерам (или только одному юзеру) логиниться с локалхоста.
host all all 127.0.0.1/32 md5
здесь первое all — это всем базам, второе all — всем юзерам.
Как потом зайти в базу blabla от имени юзера db_user? Я имею в виду подключитсья через консоль?
PostgreSQL может авторизовать пользователя не только по паролю, но и по факту того что процесс запущен от пользователя, который совпадает с пользователем базы: http://postgrespro.ru/doc/auth-methods.html#AUTH-IDENT.
SuperUser'ов (аналог root в mysql) в PostgreSQL может быть несколько, по умолчанию это postgres.
Под другим пользователем — psql -U otheruser, советую почитать: http://postgrespro.ru/doc/client-authentication.html
Всё после apt-get install можно сделать из графического интерфейса pgAdmin
Угу, вот только подключиться из pgAdmin к базе может быть не просто.
Отдельная головная боль — администрирование. Особенно если пришла в голову гениальная идея повесить базы разных приложений на один сервер, а потом отреплицировать только одну из них. Да и просто пользователей добавлять. Понятно, что многое приходит с опытом, но если нюансы мускуля впитывал можно сказать десятилетия с ростом сложности задач, и уже интуитивно обходишь узкие места, то тут приходится в сжатые сроки набивать все шишки, разрываясь на части, поскольку всё взаимосвязано.
Может, phpPgAdmin улучшилась в последнее время, но с год назад пользоваться им было
Что с myqsl, что с postgresql (и другими базами) работа в итоге будет одинаковой
В MySql через тот же phpmyadmin можно быстро экспортнуть и импортнуть базу, в два клика. В postres (было давно могу чего то напутать), там какие то штуки с пользователями и ролями серьезные, потом через командную строку через pg экпортируешь и импортируешь.
Расскажите, кто работает с postres, как быстро и просто переносить БД и синхронизировать, в два клика. Какие пути есть.
Лично мне проще вызвать pg_dump, т.к. сам я консолью пользуюсь гораздо чаще, чем мышкой.
Для поиска по параметрам создаются индексы типа таких:
CREATE INDEX goods_width_size_index
ON public.goods
USING btree
((json ->> 'width'::text) COLLATE pg_catalog."default");
и всё, параметры (например цвет, ширину) можно смело использовать прямо в запросе:
SELECT id, title as name,
json->'width' as width,
json->'length' as length
FROM goods WHERE category = '211' AND
json @> '{"color": "red"}' AND -- нужен красный цвет, да
(json->>'width')::int >= 1200; -- и широкий чтобы был!
Хоть и будет справедливо сказать, что я не пробовал
PostgreSQL — не Rocket Science. Почем сейчас яйца?