اولین جدول پروژه را که میسازی، یک تصمیم کوچک ولی ماندگار هم گرفتهای: دادهها کجا بمانند. عوض کردن دیتابیس بعد از چند ماه یعنی بازنویسی کوئریها، مهاجرت داده و چند شب بیخوابی. برای همین سؤال MySQL یا PostgreSQL را بهتر است همان روز اول جواب بدهی، نه وقتی جدول سفارشها به چند میلیون ردیف رسیده.
هر دو رایگان و متنباز هستند، هر دو SQL میفهمند و هر دو در پروژههای خیلی بزرگ امتحانشان را پس دادهاند. تفاوت در جزئیات است: معماری اتصال، نوع دادهها، رفتار تراکنشها، افزونهها و اکوسیستمی که دور هر کدام شکل گرفته. این مقاله همین جزئیات را با مثال کنار هم میگذارد. اگر با خود مفهوم دیتابیس رابطهای آشنا نیستی، اول پایگاه داده چیست و انواع آن کدامند را بخوان.

MySQL و PostgreSQL را در دو خط بشناس
MySQL از دههٔ ۹۰ میلادی دیتابیس پیشفرض وب بوده؛ همان M در پشتهٔ LAMP. الان مالکش Oracle است، نسخهٔ Community با مجوز GPLv2 منتشر میشود و نسخههای تجاری هم دارد. موتور ذخیرهسازی پیشفرضش InnoDB است که تراکنش و کلید خارجی را پشتیبانی میکند. MariaDB انشعابی از MySQL است که توسعهدهندگان اولیهاش ساختند و در بیشتر کاربردهای وب جایگزین مستقیم آن است.
PostgreSQL خودش را «دیتابیس رابطهای-شیءگرا» معرفی میکند. پشتش هیچ شرکت واحدی نیست و یک جامعهٔ جهانی توسعهاش میدهد. مجوزش PostgreSQL License است که شبیه MIT و BSD خیلی آزاد است. شهرتش به پایبندی دقیق به استاندارد SQL، نوعهای دادهٔ متنوع و افزونههایی مثل PostGIS و pgvector است.
MySQL یا PostgreSQL؛ جدول مقایسهٔ سریع
| معیار | MySQL | PostgreSQL |
|---|---|---|
| مدل اتصال | یک thread برای هر اتصال | یک process برای هر اتصال |
| JSON | نوع JSON با توابع مخصوص | JSON و JSONB، با ایندکس GIN روی JSONB |
| تغییر ساختار جدول (DDL) در تراکنش | هر دستور DDL تراکنش را commit میکند | DDL داخل تراکنش اجرا و در صورت خطا rollback میشود |
| افزونهها | محدود؛ تمرکز روی موتور InnoDB | سیستم Extension غنی (PostGIS، pgvector، pg_stat_statements و…) |
| نوعهای داده | نوعهای استاندارد | آرایه، range، UUID، شبکه (inet)، نوعهای تعریفشده توسط کاربر |
| مجوز | GPLv2 بهعلاوهٔ مجوز تجاری Oracle | PostgreSQL License (آزاد، شبیه MIT) |
| پورت پیشفرض | 3306 | 5432 |
| ابزار مدیریت تحت وب رایج | phpMyAdmin | pgAdmin |
| CMSهای رایج | وردپرس، ووکامرس، جوملا | معمولاً پشتیبانی رسمی ندارند |
معماری اتصال؛ چرا PostgreSQL به Pooler نیاز دارد
طبق مستندات PostgreSQL، این دیتابیس مدل «یک process برای هر کاربر» دارد: هر اتصال جدید یک پروسهٔ جدا روی سرور میسازد. MySQL برای هر اتصال یک thread باز میکند که سبکتر است.
در عمل یعنی اگر اپلیکیشنت صدها اتصال همزمان باز میکند (مثلاً چند worker پایتون یا سرورلس که هر کدام اتصال خودشان را میخواهند)، PostgreSQL بدون یک connection pooler مثل PgBouncer زودتر حافظه کم میآورد. با یک pooler این مشکل تقریباً حل میشود، ولی یک قطعهٔ دیگر به زیرساخت اضافه شده. MySQL در این سناریو بیدردسرتر شروع میکند.
JSON و دادههای نیمهساختاریافته
هر دو JSON را میشناسند، ولی PostgreSQL یک قدم جلوتر است. نوع JSONB داده را به شکل باینری تجزیهشده ذخیره میکند؛ نوشتنش کمی کندتر است، ولی پردازش و جستجو در آن خیلی سریعتر است و میشود رویش ایندکس GIN ساخت. نتیجه این است که برای خیلی از پروژهها، کنار جدولهای رابطهای یک ستون JSONB کار یک دیتابیس سندمحور جدا را میکند.
-- PostgreSQL: index and query a JSONB column
CREATE TABLE events (
id bigserial PRIMARY KEY,
payload jsonb NOT NULL
);
CREATE INDEX idx_events_payload ON events USING gin (payload);
SELECT id FROM events
WHERE payload @> '{"type": "order", "status": "paid"}';
در MySQL هم ستون JSON و توابعی مثل JSON_EXTRACT داری، اما برای ایندکس کردن باید از ستونهای generated یا ایندکسهای functional کمک بگیری. اگر دادههای نیمهساختاریافته بخش اصلی پروژه است، این تفاوت در طول زمان حس میشود. برای مقایسه با دیتابیسهای غیررابطهای هم معرفی دیتابیس NoSQL را ببین.
تراکنشها و تغییر ساختار جدول
این بخش معمولاً روز مهاجرت (migration) خودش را نشان میدهد. در MySQL، دستورهای DDL مثل ALTER TABLE طبق مستندات رسمی یک commit ضمنی انجام میدهند. اگر migration وسط کار خطا بدهد، نیمی از تغییرها اعمال شده و نیمی نه، و باید دستی جمعش کنی.
در PostgreSQL میتوانی چند تغییر ساختاری را داخل یک تراکنش بگذاری. اگر یکی خطا داد، کل بسته rollback میشود و دیتابیس به حالت قبل برمیگردد:
BEGIN;
ALTER TABLE users ADD COLUMN phone text;
CREATE INDEX idx_users_phone ON users (phone);
-- if anything fails here, nothing above is applied
COMMIT;
برای تیمهایی که زیاد deploy میکنند و migration خودکار دارند (Django، Rails، Laravel)، همین ویژگی یکی از دلیلهای اصلی انتخاب PostgreSQL است.
کوئریهای پیچیده و گزارشگیری
MySQL از نسخهٔ 8.0 به بعد CTE و توابع پنجرهای (window functions) را دارد و فاصلهاش با PostgreSQL در SQL پایه کم شده. هنوز چند جای مهم فرق میکند:
- برنامهریز کوئری PostgreSQL در joinهای چندجدولی و subqueryهای سنگین معمولاً تصمیمهای بهتری میگیرد و انواع join (hash، merge، nested loop) را در اختیار دارد.
- PostgreSQL ایندکسهای جزئی (partial)، ایندکس روی عبارت، و انواع ایندکس GIN، GiST و BRIN را دارد.
- materialized view در PostgreSQL بهصورت داخلی پشتیبانی میشود؛ در MySQL باید با جدول و job جدا شبیهسازیاش کنی.
برای پروژهای که داشبورد، گزارش مالی یا تحلیل داده دارد، اینها در عمل زمان پاسخ را عوض میکنند. اگر از PostgreSQL استفاده میکنی، با ابزاری مثل pgHero کوئریهای کند را راحتتر پیدا میکنی.
سرعت در MySQL یا PostgreSQL؛ کدام سریعتر است؟
جواب صادقانه: به بار کاری بستگی دارد. در خواندنهای ساده با کلید اصلی و کوئریهای کوتاهِ پرتعداد (الگوی رایج سایتهای محتوایی)، MySQL با InnoDB خیلی سریع و کممصرف است. در کوئریهای تحلیلی، نوشتن همزمان زیاد و joinهای پیچیده، PostgreSQL معمولاً جلو میافتد.
بنچمارکهایی که اینترنت پر از آنهاست اغلب روی تنظیمات پیشفرض اجرا شدهاند. تنظیم درست shared_buffers در PostgreSQL یا innodb_buffer_pool_size در MySQL، و ایندکسگذاری درست، خیلی بیشتر از انتخاب خود دیتابیس روی سرعت اثر دارد.
اکوسیستم، CMS و فریمورکها
اینجا MySQL دست بالا را دارد. صفحهٔ پیشنیازهای وردپرس فقط MySQL 8.0 به بالا یا MariaDB 10.11 به بالا را توصیه میکند. یعنی اگر سایتت وردپرس، ووکامرس یا جوملاست، بحث تمام است: MySQL یا MariaDB. بیشتر پلاگینها و راهنماها هم روی همین فرض نوشته شدهاند.
در طرف دیگر، Django و Rails هر دو را پشتیبانی میکنند، ولی امکانات اختصاصی PostgreSQL (مثل ArrayField و جستجوی متنی در Django) فقط با PostgreSQL کار میکند. ابزارهای جدیدتر مثل Supabase، n8n در حالت پروداکشن و خیلی از ابزارهای هوش مصنوعی هم PostgreSQL را ترجیح میدهند؛ مثلاً pgvector برای ذخیرهٔ embedding در پروژههای RAG.

نقطهضعف هر کدام
MySQL: DDL غیرتراکنشی، امکانات کمتر برای نوعهای دادهٔ پیشرفته، و این واقعیت که جهت توسعهاش را Oracle تعیین میکند. بعضی تیمها به همین دلیل MariaDB را ترجیح میدهند، ولی MariaDB در نسخههای جدید از MySQL فاصله گرفته و همهٔ امکانات MySQL 8 را عیناً ندارد.
PostgreSQL: مصرف حافظهٔ بیشتر به ازای هر اتصال، نیاز به VACUUM و توجه به رشد جدولها (bloat)، و منحنی یادگیری کمی تندتر برای تنظیمات. پیدا کردن هاست اشتراکی ارزان با PostgreSQL هم سختتر از MySQL است.
پروژههای کوچک: SQLite را هم فراموش نکن
اگر پروژه یک ربات کوچک، یک ابزار داخلی یا MVP تککاربره است، شاید اصلاً سرور دیتابیس لازم نداشته باشی. SQLite یک فایل است و بدون سرور جدا کار میکند. PocketBase هم روی SQLite ساخته شده و احراز هویت و API آماده میدهد. وقتی کاربرها و نوشتنهای همزمان زیاد شد، مهاجرت به PostgreSQL مسیر رایجی است.
بالاخره MySQL یا PostgreSQL؟
| سناریو | پیشنهاد |
|---|---|
| وردپرس، ووکامرس، جوملا، پرستاشاپ | MySQL یا MariaDB |
| تیمی که فقط با MySQL کار کرده و پروژهٔ CRUD ساده دارد | MySQL |
| پروژهٔ جدید Django یا Rails | PostgreSQL |
| گزارشگیری، داشبورد و کوئریهای سنگین | PostgreSQL |
| دادهٔ JSON در کنار جدولهای رابطهای | PostgreSQL |
| دادههای مکانی یا جستجوی برداری برای هوش مصنوعی | PostgreSQL (PostGIS یا pgvector) |
| تعداد خیلی زیاد اتصال کوتاه بدون pooler | MySQL |
اگر هنوز مطمئن نیستی و پروژه به CMS خاصی وابسته نیست، PostgreSQL انتخاب امنتری برای رشد است. اگر تیمت MySQL را خوب بلد است و پروژه ساده است، همان MySQL کار را بدون دردسر جلو میبرد. دانستن خوب یک دیتابیس از انتخاب «بهترین» دیتابیس مهمتر است.
هر دو را بدون درگیری نصب و نگهداری راه بینداز
نصب دیتابیس پنج دقیقه است؛ بکاپ، بهروزرسانی امنیتی و مانیتورینگ کار همیشگی است. اگر نمیخواهی وقتت صرف اینها شود، دیتابیس ابری چابکان هر دو را بهصورت مدیریتشده دارد: دیتابیس ابری MySQL، دیتابیس ابری PostgreSQL و MariaDB. برای مدیریت تحت وب هم phpMyAdmin و pgAdmin بهصورت برنامهٔ آماده در دسترساند. مشخصات و تعرفهها را در جدول پلنهای همان صفحه ببین. اگر میخواهی دیتابیس را خودت کنار اپلیکیشن روی سرور نصب کنی، سرور ابری هم گزینهٔ دیگری است. برای آشنایی بیشتر با این مدل، دیتابیس مدیریت شده چیست و DBaaS چیست را بخوان.
سؤالات متداول
MySQL یا PostgreSQL برای یادگیری کدام بهتر است؟
SQL پایه در هر دو تقریباً یکی است. اگر هدفت توسعهٔ وردپرس و PHP است با MySQL شروع کن؛ اگر بکاند پایتون یا تحلیل داده کار میکنی، PostgreSQL. برای مرور دستورها معرفی زبان SQL را ببین.
میشود بعداً از MySQL به PostgreSQL مهاجرت کرد؟
بله. ابزاری مثل pgloader جدولها و داده را منتقل میکند، ولی کوئریهایی که از توابع خاص MySQL استفاده کردهاند باید بازنویسی شوند. هرچه پروژه بزرگتر باشد، مهاجرت پرهزینهتر است.
MariaDB همان MySQL است؟
MariaDB از MySQL جدا شده و در بیشتر کاربردهای وب، از جمله وردپرس، جایگزین مستقیم آن است. در امکانات جدیدتر دو مسیر جدا رفتهاند، پس اگر از ویژگی خاصی استفاده میکنی، مستندات همان نسخه را چک کن.
کدام برای ذخیره embedding در پروژههای هوش مصنوعی مناسب است؟
PostgreSQL با افزونهٔ pgvector رایجترین انتخاب است، چون دادههای معمولی و بردارها را در یک دیتابیس نگه میدارد و با SQL قابل جستجوست.
آیا PostgreSQL برای سایتهای کوچک زیادی سنگین است؟
نه. PostgreSQL با تنظیمات پیشفرض روی منابع کم هم اجرا میشود. سنگینیاش فقط وقتی حس میشود که تعداد اتصالها زیاد باشد و pooler نداشته باشی.