دیتابیس رابطهای به زبان ساده
در یک دیتابیس رابطهای، داده در جدولها نگهداری میشود: هر ردیف یک «چیز» است (یک مشتری، یک سفارش، یک تخته فرش) و هر ستون یک ویژگی آن. جدولها با کلید به هم وصل میشوند؛ مثلاً ستون customer_id در جدول سفارشها به کلید اصلی جدول مشتریان اشاره میکند. زبان کار با این دادهها SQL است؛ زبانی «اعلانی» که در آن میگویید چه میخواهید، نه چطور پیدایش کنید. پیدا کردن بهترین مسیر اجرا کار بهینهساز (Optimizer) است.
ارزش واقعی یک سیستم مدیریت دیتابیس (RDBMS) فقط ذخیرهی داده نیست؛ این است که وقتی صد کاربر همزمان سفارش ثبت میکنند، برق میرود یا دو نفر یک رکورد را همزمان ویرایش میکنند، داده سالم بماند. در فصل ششم میبینیم MySQL این را با موتور InnoDB، تراکنش و قفل تضمین میکند.
چرا MySQL؟
- پشت وردپرس، ووکامرس، Magento و بخش بزرگی از وب؛ تقریباً هر هاست اشتراکی ایرانی آن را دارد.
- پشتیبانی کامل در جنگو، لاراول، Node.js و هر زبان دیگر.
- Replication ساده و بالغ، ابزارهای بکاپ فراوان و جامعهی بزرگ.
- از نسخهی 8.0 امکانات مدرن: CTE، Window Function، JSON، CHECK و ایندکس نامرئی.
کدام نسخه؟
| نسخه | وضعیت | توصیه |
|---|---|---|
| 5.7 | پایان پشتیبانی (اکتبر 2023) | فقط مهاجرت؛ هیچ پروژهی جدیدی |
| 8.0 | پایان پشتیبانی رسمی در آوریل 2026 | هنوز بسیار رایج؛ برنامهی ارتقا به 8.4 داشته باشید |
| 8.4 LTS | نسخهی پشتیبانی بلندمدت | انتخاب پیشفرض برای تولید |
| 9.x Innovation | انتشار فصلی، عمر کوتاه | برای آزمایش امکانات جدید، نه سرور اصلی |
MySQL، MariaDB یا PostgreSQL؟
| موضوع | MySQL 8.4 | MariaDB 11 | PostgreSQL |
|---|---|---|---|
| مالک | Oracle | بنیاد MariaDB (انشعاب از MySQL) | جامعهی متنباز |
| JSON | نوع دودویی واقعی | مستعار LONGTEXT با بررسی اعتبار | JSONB بسیار قوی |
| احراز هویت پیشفرض | caching_sha2_password | mysql_native_password / ed25519 | SCRAM-SHA-256 |
| GTID | قالب UUID:N | قالب domain-server-seq (ناسازگار) | — |
| نقطهی قوت | سادگی، اکوسیستم وب | امکانات اضافه، سازگاری با سیستمعاملها | SQL غنی، افزونهها |
MariaDB در ظاهر «همان MySQL» است و کلاینت و بیشتر SQL مشترک است، اما از نسخهی 10 به بعد مسیرشان جدا شده؛ فایل بکاپ، Replication و بعضی collationها بین این دو لزوماً جابهجا نمیشوند. در این دوره هرجا تفاوت مهم باشد اشاره میکنیم.
-- نسخهی سرور و موتور پیشفرض را همیشه اول بدانید
SELECT VERSION(), @@version_comment, @@default_storage_engine;
نکتههایی که کمتر کسی میداند
- اگر خروجی
VERSION()چیزی مثل10.11.6-MariaDBبود، شما MySQL ندارید؛ بسیاری از هاستها و توزیعها بستهیmysqlرا در واقع با MariaDB پر میکنند. - بکاپی که از MySQL 8 گرفته شده ممکن است در MariaDB با خطای
Unknown collation: utf8mb4_0900_ai_ciبازیابی نشود؛ این collation در MariaDB (دستکم نسخههای قدیمیتر) وجود ندارد. - MyISAM هنوز در MySQL هست، اما تراکنش، کلید خارجی و بازیابی پس از خرابی ندارد. هر جدول MyISAM در پروژهی قدیمی را به InnoDB تبدیل کنید.
- شمارهی نسخهی 8.0.x مهم است: امکاناتی مثل CHECK (8.0.16)، EXPLAIN ANALYZE (8.0.18) و INTERSECT (8.0.31) در میانهی عمر 8.0 اضافه شدهاند.
- Query Cache معروف MySQL در 8.0 کاملاً حذف شده؛ راهنماهای قدیمی که
query_cache_sizeرا تنظیم میکنند باعث خطای شروع سرور میشوند.