فرض کنید در حال ساخت وبسایتی هستید که کاربران در آن ثبتنام میکنند، مطلب منتشر میکنند، نظر مینویسند و دوره آموزشی میخرند. شاید برایتان این سوال پیش بیاید که این همه این اطلاعات کجا ذخیره میشود؟ پاسخ ساده است: در یک پایگاه داده.
اگر تابهحال از وردپرس استفاده کردهاید، در شبکههای اجتماعی مطالب دیگران را خواندهاید و یا از یک فروشگاه آنلاین خریدی انجام دادهاید، بدون اینکه بدانید، از MySQL استفاده کردهاید.
MySQL محبوبترین سیستم مدیریت پایگاه داده رابطهای (RDBMS) منبعباز در دنیاست. شرکتهای غولی مانند فیسبوک، یوتیوب، اوبر و Airbnb برای مدیریت دادههای حجیم خود MySQL را برگزیدهاند.
در این مقاله قرار بر این نیست که صرفا یک تعریف خشک و خالی از MySQL بخوانید. هدف این است که عمیقا بدانید که MySQL چیست و از صفر تا صد با این فناوری شگفتانگیز، معماری، کاربردها، مزایا و معایب و چشمانداز آینده آن آشنا شوید. چرا که برای هر فرد علاقمند به دنیای برنامهنویسی و نرمافزار، آموختن MySQL به اندازه یادگیری جاوا یا پایتون یا... ضرورت دارد، زیرا هر برنامه کاربردی به ذخیرهسازی داده نیاز دارد.
MySQL چیست؟ MySQL یک سیستم مدیریت پایگاه داده رابطهای (RDBMS) متنباز است که از زبان SQL برای ذخیره، مدیریت و دستکاری دادهها استفاده میکند.
MySQL یک نرمافزار است که دادهها را در قالب جداول مرتبط با هم ذخیره و برای مدیریت آنها از زبان SQL استفاده میکند.
منظور از پایگاه داده رابطهای یا RDBMS (مخفف Relational Database Management System) این است که MySQL دادهها را در جداول مرتبط با هم ذخیره میکند. تصور کنید یک فایل اکسل دارید که شامل چندین شیت است. MySQL چیزی شبیه به همان فایل اکسل شماست، اما با قدرتی میلیونها برابر بیشتر و قابلیت جستجوی آنی.
مثال ۱) یک دانشگاه اطلاعات ۲۰,۰۰۰ دانشجو را نگهداری میکند. در پایگاه داده MySQL این دانشگاه جداول زیر را داریم:
این سه جدول با استفاده از کلیدهای خارجی (Foreign Keys) با هم رابطه دارند. به همین دلیل به آن «پایگاه داده رابطهای» میگویند.
مثال ۲) در مثالی متفاوت فرض کنید جدولی داریم به نام جدولusers:
| id | name | age | |
|---|---|---|---|
| 1 | Ali Reza | ali@example.com | 22 |
| 2 | Sara Karimi | sara@example.com | 24 |
جدول دیگری داریم به نام orders:
| order_id | user_id | product_name | price |
|---|---|---|---|
| 101 | 1 | Laptop | 1000$ |
ستون user_id به id در جدول users اشاره میکند. این یعنی سفارش ۱۰۱ متعلق به علیرضاست. این یک رابطه است.
در این مثال کلیدها عبارتند از:
id در جدول users)user_id در جدول orders)شاید برایتان سوال شود که چرا سازندگان MySQL چنین نامی را انتخاب کردهاند؟ در سال ۱۹۹۵ سه دولوپر اهل سوئد با نامهای David Axmark، Allan Larsson و Michael Widenius با هم شرکتی را تاسیس کردند. Michael "Monty" Widenius که بنیانگذار اصلی بود، از نام دخترش یعنی «My» برای نامگذاری شرکت الهام گرفت و نام شرکت را MySQL AB نهاد.
در سال ۲۰۰۰ MySQL بهعنوان محصول این شرکت بهصورت متنباز و تحت مجوز GNU GPL رسما منتشر شد. در سال ۲۰۰۸ شرکت Sun Microsystems این شرکت را خریداری کرد و سپس در سال ۲۰۰۹ شرکت خوشنام و بزرگ اوراکل آن را خرید و مالک MySQL شد.
MySQL با گذشت بیش از ۲۵ سال هنوز که هنوز است یکی از محبوبترین، پایدارترین و امنترین پایگاههای داده جهان است. جالب است بدانید وقتی اوراکل MySQL را خرید، بسیاری از توسعهدهندگان MySQL نگران شدند که MySQL غیرمتنباز شود. به همین دلیل، مونتی که بنیانگذار اصلی بود یک شاخه جدید (در اصطلاح فورک) را از MySQL ایجاد کرد و نام MariaDB بر آن گذاشت که تا امروز به صورت کاملا متنباز باقی مانده است. (در ادامه این مقاله و در بخش مقایسه به آن میپردازیم).
تقریبا همه در ابتدا این پرسش را مطرح میکنند که «MySQL با SQL چه تفاوتی دارد؟»
در پاسخ باید بگوییم:
SQL شامل دستوراتی مثل SELECT * FROM users; است یعنی یک زبان است ولی MySQL نرمافزاری است که این زبان را میفهمد، اجرا میکند و نتیجه را برمیگرداند.
اگر به زبان SQL مسلط باشید، تقریبا میتوان گفت که به هر پایگاه داده رابطهای دیگری هم مسلط میشوید.
ما یک مقاله خیلی جامع و جذاب در خصوص معماری MySQL نوشتهایم. به شما توصیه میکنیم حتما این مقاله را مطالعه کنید چون یکبار برای همیشه شما را به درک عمیق از معماری MySQL میرساند. در اینجا اما بهصورت سطحیتر و صرفا جهت آشنایی شما معماری داخلی MySQL را تشریح میکنیم و توضیح میدهیم که MySQL چگونه کار میکند؟
MySQL از مدل کلاینت-سرور که مدلی قدیمی اما همچنان قویست پیروی میکند. برای درک این مدل باید MySQL را شبیه به یک رستوران دانست:
بهطور خلاصه شما، کوئریمیفرستید، سرور آن را پردازش میکند و نتیجه را برمیگرداند.
یکی از ویژگیهای بسیار عالی MySQL اینست که به توسعهدهنده اجازه میدهد که چگونگی ذخیره داده روی دیسک را انتخاب کند. به این گزینهها Storage Engine یا موتور ذخیرهسازی گفته میشود. دو موتور MySQL نسبت به سایرین مشهورترند که عبارتند از:
از استاندارد ACID پیروی میکند و به همین دلیل برای تراکنشهای مالی و برنامههای حساس عالی است. ACID چیست؟ فرض کنید شما دارید از طریق سیستم، مبلغ یکصد میلیون تومان را از حساب یک شخص به شخص دیگر انتقال میدهید. اگر در حین انتقال وجه برق قطع شود نباید پول از حساب مبدا کسر شود ولی به حساب مقصد نرسد. InnoDB تضمین میکند که اینطور نشود. این موتور همچنین از قفلگذاری Row-Level استفاده میکند. یعنی فقط همان سطری را که تغییر میدهد قفل میکند و بقیه جدول را آزاد میگذارد که این قابلیت در وبسایتهای پربازدید و سیستمهای مالی خیلی به کار میآید.
سرعت بالایی در خواندن دارد اما از تراکنش پشتیبانی نمیکند و اگر برق برود یا خطایی رخ دهد ممکن است داده آسیب ببیند. همچنین از قفلگذاری Table-Level استفاده میکند. یعنی اگر یک سطر جدول را تغییر دهد، کل جدول را قفل میکند که این باعث بالا رفتن زمان انتظار کاربران میشود. این موتور فقط در سیستمهایی که به خواندن نیاز داریم (مثلا دشبورد) قابل استفاده است.
از زمان ارسال درخواست تا دریافت نتیجه در دیتابیس (پایگاه داده) MySQL مراحل زیر طی میشود:
آمارها نشان میدهند حدود ۸۰٪ وبسایتهای دنیا از MySQL استفاده میکنند اما چه رازهایی پشت این محبوبیت جهانی پس از دههها وجود دارد؟ در ادامه به برخی از مهمترین مزایای MySQL میپردازیم:
میتوانید MySQL را روی هر تعداد سروری که دلتان میخواهد، بدون پرداخت حتی یک ریال نصب کنید. کد آن در دسترس است و جامعه توسعهدهندگان آن بزرگ است و مدام در حال بهبودبخشیدن و توسعه آن هستند.
MySQL قابلیت خواندن سریع دارد. در وب هم بیشتر عملیات از نوع خواندن هستند تا نوشتن.
اگر میخواهید بدانید چطور سرعت کوئریهای خود را تا ۱۰ برابر افزایش دهید، این مقاله را مطالعه کنید: سرعت کوئریهای MySQL را ۱۰ برابر بالا ببرید!
MySQL از رمزگذاری SSL برای ارتباط بین کلاینت و سرور پشتیبانی میکند که به معنای امنیت بالاست. همچنین موتور InnoDB، از استاندارد ACID پیروی مینماید که به حفظ دادهها در شرایط بحرانی مثل قطع برق کمک میکند.
چه یک وبلاگ کوچک با ۱۰ بازدیدکننده در روز داشته باشید چه صاحب فیسبوک با میلیاردها کاربر باشید (!) میتوانید از MySQL استفاده کنید.
MySQL روی ویندوز، لینوکس، مک و حتی داکر بدون هیچ مشکلی اجرا میشود.
هر سوالی داشته باشید، احتمالاً هزار نفر قبلا جواب آن را در سایتهای مختلف در اینترنت نوشتهاند. البته با وجود هوش مصنوعی بعید است کارتان لنگ بماند!
در ادامه لیستی از معایب MySQL ارائه میکنیم اما قبل از آن باید بگوییم وجود این معایب اصلا به این معنا نیست که این پایگاه داده بد است، بلکه به این معناست که برای همه کارها ساخته نشده است (همهچیز را همگان دانند!):
دستور FULL OUTER JOIN InnoDBبر خلاف استاندارد SQL در MySQL وجود ندارد و برای شبیهسازی آن ناچارید از ترکیب LEFT JOIN و RIGHT JOIN با UNION استفاده کنید که همین مسئله، کدنویسی را پیچیدهتر میکند.
MySQL برای مقیاس عمودی (یک سرور قدرتمند) عالی است، اما برای مقیاس افقی (صدها سرور معمولی) مناسب نیست. مدل Master-Slave فقط یک سرور نوشتنی دارد که در ترافیک بسیار بالا دردسر درست میکند!
توابع مکانی پایه در MySQL موجود هستند، اما از این نظر به گردپای PostGIS در PostgreSQL هم نمیرسد. برای پروژههای سنگین نقشه و مسیریابی، سراغ MySQL نروید.
نوع دادههایی مثل Array، HSTORE و JSONB در MySQL غایبند. همچنین پشتیبانی از JSON در MySQL نسبت به PostgreSQL محدودتر است.
MySQL برای تراکنشهای سریع (OLTP) ساخته شده، اما در گزارشگیریهای سنگین کم میآورد. موتور Row-Based آن برای میلیونها رکورد چندان جالب کار نمیکند.
نمیتوانید بیشتر از ۶۱ جدول را در یک کوئری JOIN کنید. هرچند این عدد زیاد است، اما بهرحال ما وظیفه داشتیم به این موضوع اشاره کنیم :)
یک کوئری SELECT هرچقدر هم که سنگین باشد در MySQL فقط از یک هسته پردازنده استفاده میکند. این درحالیست که PostgreSQL میتواند یک کوئری را بین چند هسته تقسیم کند و نتیجه اینکه آن را چند برابر سریعتر اجرا میکند.
MySQL تا نسخه ۸.۰ (۲۰۱۸) عملاً از توابع مهمی مثل ROW_NUMBER() و RANK() پشتیبانی نمیکرد که واقعا عجیب بود. اما هماکنون برطرف شده است.
اگر هزاران کاربر همزمان بخواهند مشخصات یک محصول خاص را تغییر دهند و بهروزرسانی کنند، MySQL ممکن است به مشکل بخورد. برای چنین سناریوهایی، ابزارهایی مثل Redis مطمئنترند.
بسیاری از جامعه متنباز به اوراکل اعتماد کامل ندارند (شرکت اوراکل کاملا موودی عمل میکند و سابقه خیلی بدی درمیان دولوپرها دارد). حتی خود سازندگان MySQL هم به اوراکل اعتماد نداشتند!
MySQL فقط یک ابزار آکادمیک نیست، بلکه قلب تپنده هزاران سیستم در دنیای واقعی است. برخی از این کاربردها عبارتند از:
جالب است بدانید که بیشتر از ۴۰٪ کل وبسایتهای جهان دارند روی وردپرس اجرا میشوند و وردپرس هم بهطور پیشفرض از MySQL استفاده میکند. دروپال و جوملا هم از MySQL استفاده میکنند.
پلتفرمهایی مثل ووکامرس و مجنتو از MySQL برای ذخیره محصولات، سفارشات، مشتریان و موجودی انبار استفاده میکنند.
LAMP از حروف اول Linux, Apache, MySQL, PHP/Python/Perl گرفته شده است. این مجموعه، استانداردی طلایی برای ساخت وباپلیکیشنهای داینامیک فراهم کردهاند.
شرکتهای بزرگی مانند Slack، Airbnb، Twitter (X)، Netflix و Uber از MySQL در مقیاس گسترده و باورنکردنی استفاده میکنند.
سرویسهای ابری مثل Amazon RDS for MySQL و Aiven for MySQL نسخه مدیریتشده MySQL را ارائه میدهند که بکاپ، آپدیت و مانیتورینگ آن به صورت خودکار انجام میشود.
توصیه عملی: اگر دانشجو هستید، خوب است که در همین ابتدای مسیر یک پروژه ساده با PHP و MySQL انجام دهید (مثل یک فرم ثبتنام ساده). مقاله آموزش اتصال پایگاه داده MySQL به PHP با استفاده از فرم عضویت گامبهگام این کار را به شما یاد میدهد.
در مورد MySQL، معماری، مزایا و کاربردهای آن زیاد حرف زدیم اما تمام این صحبتها نباید به ما این باور اشتباه را بدهند که MySQL همیشه بهترین انتخاب است. سه رقیب مهم برای MySQL وجود دارد که در ادامه آنها را با هم مقایسه میکنیم.
هر دو محبوبند، هر دو متنبازند، اما تفاوتهای کلیدی دارند:
| ویژگی | MySQL | PostgreSQL |
|---|---|---|
| تمرکز اصلی | سرعت در خواندن و تراکنشهای ساده | انطباق کامل با استانداردهای SQL و کوئریهای پیچیده |
| نوع دادهها | استاندارد (INT, VARCHAR, DATE, JSON) | پیشرفته (ARRAY, JSONB, HSTORE, GIS) |
| همزمانی (Concurrency) | خوب است (با Row-Level Locking) | عالی است (با MVCC پیشرفته) |
| مناسب برای | وباپلیکیشنها، CMS، فروشگاهها | سیستمهای تحلیلی، دادههای مکانی، دادههای پیچیده |
با مطالب آمده در جدول بالا باید گفت اگر قصد دارید با وردپرس کار کنید، یا توسعهدهنده لاراول هستید یا وباپلیکیشنهای متعددی دارید، MySQL انتخاب مناسبی است اما اگر میخواهید تحلیل داده سنگین انجام دهید یا با GIS کار کنید، PostgreSQL مناسب شماست.
MySQL مانند یک کمد قفسهبندی شده است که هرچیزی را در آن باید در جای مشخصی بگذارید ولی MongoDB مثل یک صندوقچه است که میتوانید هرچیزی را درون آن بیندازید!
به بیان فنی MySQL، رابطهای، مبتنی بر استانداردهای ACID و مناسب برای دادههای منظم و ساختاریافته است ولی MongoDB بر مبنای سند (Document-based)، مناسب برای دادههای نیمهساختاریافته و دارای مقیاسپذیری افقی خیلی بالایی است.
در قسمت تاریخچه در این مقاله اشاره کردیم که MariaDB یک فورک (شاخه) از MySQL است اما راه خود را کاملا از MySQL جدا کرده است. ماریادیبی موتورهای ذخیرهسازی بیشتری دارد و محدودیتهایش از MySQL کمتر است. اما محبوبیت MySQL را ندارد.
شاید بتوان گفت MariaDB جدیترین رقیب MySQL است. اگر میخواهید بدانید چرا، این مقاله را مطالعه کنید: MySQL یا MariaDB؟ ۸ دلیلی که توسعهدهندگان MariaDB را ترجیح میدهند.
و اگر میخواهید مقایسه وسیعتری داشته باشید، مقاله مزایا و معایب 5 پایگاه داده محبوب در وب منبع کاملی است.
MySQL فقط یک دیتابیس سنتی و قدیمی نیست و همگام با پیشرفتهای تکنولوژی با سرعت چشمگیری در مسیر تحول قرار دارد و خودش را کاملا بهروز و خوشآینده نگه داشته است.
شرکت اوراکل سرویسی به نام MySQL HeatWave را عرضه کرده که یک دیتابیس ابری است و قابلیت انجام پردازشهای تحلیل داده را با سرعت بسیار بالا و بدون نیاز به انتقال داده به دیتابیس دیگر را فراهم کرده است؛ قبل از این، برای تحلیل داده باید توسعهدهندگان ابتدا داده را به دیتابیسهایی مثل Snowflake یا Redshift منتقا مینمودند. برای آشنایی با قابلیتهای تحلیلی MySQL HeatWave، میتوانید مستندات رسمی آن را مطالعه کنید
همچنین از این پس دیگر نیازی نیست MySQL را روی سرور فیزیکی خود نصب کنید. سرویسهای مدیریتشدهای چون Amazon RDS for MySQL و Aiven for MySQL کار مدیریت، بکاپگیری، مانیتورینگ و مقیاسپذیری را از دوش دولوپرها برداشتهاند.
علاوه بر اینها، نسل بعدی MySQL به سمت Serverless شدن میرود. یعنی چه؟ یعنی اینکه شما پایگاه داده را بهعنوان یک سرویس مصرف میکنید و فقط به اندازه استفاده خود هزینه پرداخت میکنید. بینظیر است، نه؟
تسلط بر MySQL یک مهارت ضروری برای هر برنامهنویس است. در این مقاله شما فراگرفتید که:
قدم بعدی شما این است که همین لحظه XAMPP را نصب کنید و یک دیتابیس ایجاد کنید. از قدیم گفتهاند که «عالم بدون عمل به هیچ دردی نمیخورَد!». زمان طلاست و آن را از دست ندهید. پیشنهاد میکنیم آموزش MySQL را با یکی از این دو دوره آموزشی شروع کنید:
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.