MySQL چیست؟ راهنمای جامع از صفر تا صد

What is MySQL?

31 اردیبهشت 1405
what-is-mysql

فرض کنید در حال ساخت وب‌سایتی هستید که کاربران در آن ثبت‌نام می‌کنند، مطلب منتشر می‌کنند، نظر می‌نویسند و دوره آموزشی می‌خرند. شاید برایتان این سوال پیش بیاید که این همه این اطلاعات کجا ذخیره می‌شود؟ پاسخ ساده است: در یک پایگاه داده.

اگر تابه‌حال از وردپرس استفاده کرده‌اید، در شبکه‌های اجتماعی مطالب دیگران را خوانده‌اید و یا از یک فروشگاه آنلاین خریدی انجام داده‌اید، بدون اینکه بدانید، از MySQL استفاده کرده‌اید.

MySQL محبوب‌ترین سیستم مدیریت پایگاه داده رابطه‌ای (RDBMS) منبع‌باز در دنیاست. شرکت‌های غولی مانند فیس‌بوک، یوتیوب، اوبر و Airbnb برای مدیریت داده‌های حجیم خود MySQL را برگزیده‌اند.

در این مقاله قرار بر این نیست که صرفا یک تعریف خشک و خالی از MySQL بخوانید. هدف این است که عمیقا بدانید که MySQL چیست و از صفر تا صد با این فناوری شگفت‌انگیز، معماری، کاربردها، مزایا و معایب و چشم‌انداز آینده آن آشنا شوید. چرا که برای هر فرد علاقمند به دنیای برنامه‌نویسی و نرم‌افزار، آموختن MySQL به اندازه یادگیری جاوا یا پایتون یا... ضرورت دارد، زیرا هر برنامه کاربردی به ذخیره‌سازی داده نیاز دارد.

۲. MySQL چیست؟ تعریف فنی و ساده

MySQL چیست؟ MySQL یک سیستم مدیریت پایگاه داده رابطه‌ای (RDBMS) متن‌باز است که از زبان SQL برای ذخیره، مدیریت و دستکاری داده‌ها استفاده می‌کند.

MySQL یک نرم‌افزار است که داده‌ها را در قالب جداول مرتبط با هم ذخیره و برای مدیریت آن‌ها از زبان SQL استفاده می‌کند.

پایگاه داده رابطه‌ای (RDBMS) یعنی چه؟

منظور از پایگاه داده رابطه‌ای یا RDBMS (مخفف Relational Database Management System) این است که MySQL داده‌ها را در جداول مرتبط با هم ذخیره می‌کند. تصور کنید یک فایل اکسل دارید که شامل چندین شیت است. MySQL چیزی شبیه به همان فایل اکسل شماست، اما با قدرتی میلیون‌ها برابر بیشتر و قابلیت جستجوی آنی.

مثال ۱) یک دانشگاه اطلاعات ۲۰,۰۰۰ دانشجو را نگهداری می‌کند. در پایگاه داده MySQL این دانشگاه جداول زیر را داریم:

  • یک جدول به نام students داریم با ستون‌های: id، name، major، birth_date
  • یک جدول به نام courses با ستون‌های: course_id، title، credits
  • یک جدول به نام enrollments که می‌گوید «کدام دانشجو در کدام درس ثبت‌نام کرده است»

این سه جدول با استفاده از کلیدهای خارجی (Foreign Keys) با هم رابطه دارند. به همین دلیل به آن «پایگاه داده رابطه‌ای» می‌گویند.

مثال ۲) در مثالی متفاوت فرض کنید جدولی داریم به‌ نام جدولusers:

id name email 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 اشاره می‌کند. این یعنی سفارش ۱۰۱ متعلق به علیرضاست. این یک رابطه است.

در این مثال کلیدها عبارتند از:

  • Primary Key (کلید اصلی): ستونی که هر سطر را منحصربه‌فرد می‌کند. (مثل id در جدول users)
  • Foreign Key (کلید خارجی): ستونی که به کلید اصلی یک جدول دیگر اشاره دارد. (مثل user_id در جدول orders)

تاریخچه MySQL

شاید برایتان سوال شود که چرا سازندگان 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

تقریبا همه در ابتدا این پرسش را مطرح می‌کنند که «MySQL با SQL چه تفاوتی دارد؟»

در پاسخ باید بگوییم:

SQL شامل دستوراتی مثل SELECT * FROM users; است یعنی یک زبان است ولی MySQL نرم‌افزاری است که این زبان را می‌فهمد، اجرا می‌کند و نتیجه را برمی‌گرداند.

اگر به زبان SQL مسلط باشید، تقریبا می‌توان گفت که به هر پایگاه داده رابطه‌ای دیگری هم مسلط می‌شوید.

معماری داخلی MySQL: درون MySQL چه می‌گذرد؟

ما یک مقاله خیلی جامع و جذاب در خصوص معماری MySQL نوشته‌ایم. به شما توصیه می‌کنیم حتما این مقاله را مطالعه کنید چون یکبار برای همیشه شما را به درک عمیق از معماری MySQL می‌رساند. در اینجا اما به‌صورت سطحی‌تر و صرفا جهت آشنایی شما معماری داخلی MySQL را تشریح می‌کنیم و توضیح می‌دهیم که MySQL چگونه کار می‌کند؟

مدل کلاینت-سرور

MySQL از مدل کلاینت-سرور که مدلی قدیمی اما همچنان قویست پیروی می‌کند. برای درک این مدل باید MySQL را شبیه به یک رستوران دانست:

  • سرور (Server) آشپزخانه و انبار است (داده‌های اصلی اینجا هستند).
  • کلاینت (Client) شما (کاربر یا مشتری) هستید که به پیشخدمت (برنامه یا PHP/Java) سفارش می‌دهید.

به‌طور خلاصه شما، کوئریمی‌فرستید، سرور آن را پردازش می‌کند و نتیجه را برمی‌گرداند.

موتورهای ذخیره‌سازی

یکی از ویژگی‌های بسیار عالی MySQL اینست که به توسعه‌دهنده اجازه می‌دهد که چگونگی ذخیره داده روی دیسک را انتخاب کند. به این گزینه‌ها Storage Engine یا موتور ذخیره‌سازی گفته می‌شود. دو موتور MySQL نسبت به سایرین مشهورترند که عبارتند از:

InnoDB (موتور پیش‌فرض MySQL)

از استاندارد ACID پیروی می‌کند و به همین دلیل برای تراکنش‌های مالی و برنامه‌های حساس عالی است. ACID چیست؟ فرض کنید شما دارید از طریق سیستم، مبلغ یکصد میلیون تومان را از حساب یک شخص به شخص دیگر انتقال می‌دهید. اگر در حین انتقال وجه برق قطع شود نباید پول از حساب مبدا کسر شود ولی به حساب مقصد نرسد. InnoDB تضمین می‌کند که اینطور نشود. این موتور همچنین از قفل‌گذاری Row-Level استفاده می‌کند. یعنی فقط همان سطری را که تغییر می‌دهد قفل می‌کند و بقیه جدول را آزاد می‌گذارد که این قابلیت در وب‌سایت‌های پربازدید و سیستم‌های مالی خیلی به کار می‌آید.

MyISAM (موتور قدیمی)

سرعت بالایی در خواندن دارد اما از تراکنش پشتیبانی نمی‌کند و اگر برق برود یا خطایی رخ دهد ممکن است داده آسیب ببیند. همچنین از قفل‌گذاری Table-Level استفاده می‌کند. یعنی اگر یک سطر جدول را تغییر دهد، کل جدول را قفل می‌کند که این باعث بالا رفتن زمان انتظار کاربران می‌شود. این موتور فقط در سیستم‌هایی که به خواندن نیاز داریم (مثلا دشبورد) قابل استفاده است.

مراحل اجرای یک کوئری در MySQL

از زمان ارسال درخواست تا دریافت نتیجه در دیتابیس (پایگاه داده) MySQL مراحل زیر طی می‌شود:

  1. ارسال درخواست (Client Request): کاربر یک درخواست یا کوئری را ارسال می‌کند.
  2. برقراری اتصال: کلاینت به سرور MySQL وصل می‌شود.
  3. تجزیه و تحلیل (Parsing): MySQL دستوری را که ارسال کرده‌اید، می‌خواند و چک می‌کند که غلط املایی یا دستوری نداشته باشد.
  4. بهینه‌سازی: MySQL به‌صورت کاملا هوشمندانه بررسی می‌کند که بهترین و سریع‌ترین روش برای اجرای این کوئری چیست؟ (آیا از ایندکس استفاده کند؟ اول کدام جدول را بخواند؟)
  5. اجرا (Execution): موتور ذخیره‌سازی (مثل InnoDB) دستور را اجرا می‌کند و داده‌ها را از هارد دیسک یا رم می‌خواند.
  6. ایجاد نتیجه: داده‌های خوانده شده به صورت یک جدول (مجموعه نتایج) مرتب می‌شوند.
  7. ارسال پاسخ (Response): مجموعه نتایج به کلاینت برگردانده می‌شود.
  8. مدیریت تراکنش: اگر چند دستور همزمان اجرا شوند، MySQL مانع از آسیب دیدن داده‌ها می‌شود.
  9. گزارش خطا و بکاپ: اگر برق قطع شود، MySQL از فایل‌های لاگ برای بازگردانی اطلاعات استفاده می‌نماید.

مهم‌ترین مزایای MySQL کدامند؟

آمارها نشان می‌دهند حدود ۸۰٪ وب‌سایت‌های دنیا از MySQL استفاده می‌کنند اما چه رازهایی پشت این محبوبیت جهانی پس از دهه‌ها وجود دارد؟ در ادامه به برخی از مهم‌ترین مزایای MySQL می‌پردازیم:

متن‌باز و رایگان است

می‌توانید MySQL را روی هر تعداد سروری که دلتان می‌خواهد، بدون پرداخت حتی یک ریال نصب کنید. کد آن در دسترس است و جامعه توسعه‌دهندگان آن بزرگ است و مدام در حال بهبودبخشیدن و توسعه آن هستند.

سریع و کارآمد است

MySQL قابلیت خواندن سریع دارد. در وب هم بیشتر عملیات از نوع خواندن هستند تا نوشتن.

اگر می‌خواهید بدانید چطور سرعت کوئری‌های خود را تا ۱۰ برابر افزایش دهید، این مقاله را مطالعه کنید: سرعت کوئری‌های MySQL را ۱۰ برابر بالا ببرید!

امنیت بالایی دارد و مطمئن است

MySQL از رمزگذاری SSL برای ارتباط بین کلاینت و سرور پشتیبانی می‌کند که به معنای امنیت بالاست. همچنین موتور InnoDB، از استاندارد ACID پیروی می‌نماید که به حفظ داده‌ها در شرایط بحرانی مثل قطع برق کمک می‌کند.

مقیاس‌پذیر است

چه یک وبلاگ کوچک با ۱۰ بازدیدکننده در روز داشته باشید چه صاحب فیس‌بوک با میلیاردها کاربر باشید (!) می‌توانید از MySQL استفاده کنید.

Cross-Platform است

MySQL روی ویندوز، لینوکس، مک و حتی داکر بدون هیچ مشکلی اجرا می‌شود.

جامعه بزرگی از کاربران دارد

هر سوالی داشته باشید، احتمالاً هزار نفر قبلا جواب آن را در سایت‌های مختلف در اینترنت نوشته‌اند. البته با وجود هوش مصنوعی بعید است کارتان لنگ بماند!

معایب MySQL؛ نکاتی که کمتر به شما می‌گویند!

در ادامه لیستی از معایب MySQL ارائه می‌کنیم اما قبل از آن باید بگوییم وجود این معایب اصلا به این معنا نیست که این پایگاه داده بد است، بلکه به این معناست که برای همه کارها ساخته نشده است (همه‌چیز را همگان دانند!):

۱. مستقیما از FULL JOIN پشتیبانی نمی‌کند

دستور FULL OUTER JOIN InnoDBبر خلاف استاندارد SQL در MySQL وجود ندارد و برای شبیه‌سازی آن ناچارید از ترکیب LEFT JOIN و RIGHT JOIN با UNION استفاده کنید که همین مسئله، کدنویسی را پیچیده‌تر می‌کند.

۲. مقیاس‌پذیری افقی ضعیفی دارد

MySQL برای مقیاس عمودی (یک سرور قدرتمند) عالی است، اما برای مقیاس افقی (صدها سرور معمولی) مناسب نیست. مدل Master-Slave فقط یک سرور نوشتنی دارد که در ترافیک بسیار بالا دردسر درست می‌کند!

از داده‌های مکانی (GIS) پشتیبانی خوبی ندارد

توابع مکانی پایه در MySQL موجود هستند، اما از این نظر به گردپای PostGIS در PostgreSQL هم نمی‌رسد. برای پروژه‌های سنگین نقشه و مسیریابی، سراغ MySQL نروید.

از برخی انواع داده پیشرفته پشتیبانی نمی‌کند

نوع داده‌هایی مثل Array، HSTORE و JSONB در MySQL غایبند. همچنین پشتیبانی از JSON در MySQL نسبت به PostgreSQL محدودتر است.

پردازش‌های تحلیلی (OLAP) را خوب انجام نمی‌دهد

MySQL برای تراکنش‌های سریع (OLTP) ساخته شده، اما در گزارش‌گیری‌های سنگین کم می‌آورد. موتور Row-Based آن برای میلیون‌ها رکورد چندان جالب کار نمی‌کند.

برای ایجاد بیش‌ از ۶۱ جدول در JOIN محدودیت دارد

نمی‌توانید بیشتر از ۶۱ جدول را در یک کوئری JOIN کنید. هرچند این عدد زیاد است، اما بهرحال ما وظیفه داشتیم به این موضوع اشاره کنیم :)

کوئری‌ها را موازی‌سازی نمی‌کند

یک کوئری SELECT هرچقدر هم که سنگین باشد در MySQL فقط از یک هسته پردازنده استفاده می‌کند. این درحالیست که PostgreSQL می‌تواند یک کوئری را بین چند هسته تقسیم کند و نتیجه اینکه آن را چند برابر سریع‌تر اجرا می‌کند.

در پشتیبانی از Window Functions سابقه بدی دارد

MySQL تا نسخه ۸.۰ (۲۰۱۸) عملاً از توابع مهمی مثل ROW_NUMBER() و RANK() پشتیبانی نمی‌کرد که واقعا عجیب بود. اما هم‌اکنون برطرف شده است.

در نوشتن همزمان روی یک ردیف، قوی نیست

اگر هزاران کاربر همزمان بخواهند مشخصات یک محصول خاص را تغییر دهند و به‌روزرسانی کنند، MySQL ممکن است به مشکل بخورد. برای چنین سناریوهایی، ابزارهایی مثل Redis مطمئن‌ترند.

به شرکت اوراکل وابسته است

بسیاری از جامعه متن‌باز به اوراکل اعتماد کامل ندارند (شرکت اوراکل کاملا موودی عمل می‌کند و سابقه خیلی بدی درمیان دولوپرها دارد). حتی خود سازندگان MySQL هم به اوراکل اعتماد نداشتند!

کاربردهای MySQL

MySQL فقط یک ابزار آکادمیک نیست، بلکه قلب تپنده هزاران سیستم در دنیای واقعی است. برخی از این کاربردها عبارتند از:

سیستم‌های مدیریت محتوا (CMS)

جالب است بدانید که بیشتر از ۴۰٪ کل وب‌سایت‌های جهان دارند روی وردپرس اجرا می‌شوند و وردپرس هم به‌طور پیش‌فرض از MySQL استفاده می‌کند. دروپال و جوملا هم از MySQL استفاده می‌کنند.

تجارت الکترونیک (E-commerce)

پلتفرم‌هایی مثل ووکامرس و مجنتو از MySQL برای ذخیره محصولات، سفارشات، مشتریان و موجودی انبار استفاده می‌کنند.

۳. LAMP Stack (ستون اصلی وب)

LAMP از حروف اول Linux, Apache, MySQL, PHP/Python/Perl گرفته شده است. این مجموعه، استانداردی طلایی برای ساخت وب‌اپلیکیشن‌های داینامیک فراهم کرده‌اند.

۴. استارتاپ‌ها و سازمان‌ها

شرکت‌های بزرگی مانند Slack، Airbnb، Twitter (X)، Netflix و Uber از MySQL در مقیاس گسترده و باورنکردنی استفاده می‌کنند.

۵. برنامه‌های ابری و SaaS

سرویس‌های ابری مثل Amazon RDS for MySQL و Aiven for MySQL نسخه مدیریت‌شده MySQL را ارائه می‌دهند که بکاپ، آپدیت و مانیتورینگ آن به صورت خودکار انجام می‌شود.

توصیه عملی: اگر دانشجو هستید، خوب است که در همین ابتدای مسیر یک پروژه ساده با PHP و MySQL انجام دهید (مثل یک فرم ثبت‌نام ساده). مقاله آموزش اتصال پایگاه داده MySQL به PHP با استفاده از فرم عضویت گام‌به‌گام این کار را به شما یاد می‌دهد.

مقایسه MySQL با رقبا

در مورد MySQL، معماری، مزایا و کاربردهای آن زیاد حرف زدیم اما تمام این صحبت‌ها نباید به ما این باور اشتباه را بدهند که MySQL همیشه بهترین انتخاب است. سه رقیب مهم برای MySQL وجود دارد که در ادامه آن‌ها را با هم مقایسه می‌کنیم.

MySQL یا PostgreSQL

هر دو محبوبند، هر دو متن‌بازند، اما تفاوت‌های کلیدی دارند:

ویژگی MySQL PostgreSQL
تمرکز اصلی سرعت در خواندن و تراکنش‌های ساده انطباق کامل با استانداردهای SQL و کوئری‌های پیچیده
نوع داده‌ها استاندارد (INT, VARCHAR, DATE, JSON) پیشرفته (ARRAY, JSONB, HSTORE, GIS)
همزمانی (Concurrency) خوب است (با Row-Level Locking) عالی است (با MVCC پیشرفته)
مناسب برای وب‌اپلیکیشن‌ها، CMS، فروشگاه‌ها سیستم‌های تحلیلی، داده‌های مکانی، داده‌های پیچیده

با مطالب آمده در جدول بالا باید گفت اگر قصد دارید با وردپرس کار کنید، یا توسعه‌دهنده لاراول هستید یا وب‌اپلیکیشن‌های متعددی دارید، MySQL انتخاب مناسبی است اما اگر می‌خواهید تحلیل داده سنگین انجام دهید یا با GIS کار کنید، PostgreSQL مناسب شماست.

MySQL یا MongoDB (SQL در مقابل NoSQL)

MySQL مانند یک کمد قفسه‌بندی شده است که هرچیزی را در آن باید در جای مشخصی بگذارید ولی MongoDB مثل یک صندوقچه است که می‌توانید هرچیزی را درون آن بیندازید!

به بیان فنی MySQL، رابطه‌ای، مبتنی بر استانداردهای ACID و مناسب برای داده‌های منظم و ساختاریافته است ولی MongoDB بر مبنای سند (Document-based)، مناسب برای داده‌های نیمه‌ساختاریافته و دارای مقیاس‌پذیری افقی خیلی بالایی است.

MySQL یا MariaDB

در قسمت تاریخچه در این مقاله اشاره کردیم که MariaDB یک فورک (شاخه) از MySQL است اما راه خود را کاملا از MySQL جدا کرده است. ماریادی‌بی موتورهای ذخیره‌سازی بیشتری دارد و محدودیت‌هایش از MySQL کمتر است. اما محبوبیت MySQL را ندارد.

شاید بتوان گفت MariaDB جدی‌ترین رقیب MySQL است. اگر می‌خواهید بدانید چرا، این مقاله را مطالعه کنید: MySQL یا MariaDB؟ ۸ دلیلی که توسعه‌دهندگان MariaDB را ترجیح می‌دهند.

و اگر می‌خواهید مقایسه وسیع‌تری داشته باشید، مقاله مزایا و معایب 5 پایگاه داده محبوب در وب منبع کاملی است.

آینده MySQL

MySQL فقط یک دیتابیس سنتی و قدیمی نیست و همگام با پیشرفت‌های تکنولوژی با سرعت چشمگیری در مسیر تحول قرار دارد و خودش را کاملا به‌روز و خوش‌آینده نگه داشته است.

شرکت اوراکل سرویسی به نام MySQL HeatWave را عرضه کرده که یک دیتابیس ابری است و قابلیت انجام پردازش‌های تحلیل داده را با سرعت بسیار بالا و بدون نیاز به انتقال داده به دیتابیس دیگر را فراهم کرده است؛ قبل از این، برای تحلیل داده باید توسعه‌دهندگان ابتدا داده را به دیتابیس‌هایی مثل Snowflake یا Redshift منتقا می‌نمودند. برای آشنایی با قابلیت‌های تحلیلی MySQL HeatWave، می‌توانید مستندات رسمی آن را مطالعه کنید

همچنین از این پس دیگر نیازی نیست MySQL را روی سرور فیزیکی خود نصب کنید. سرویس‌های مدیریت‌شده‌ای چون Amazon RDS for MySQL و Aiven for MySQL کار مدیریت، بکاپ‌گیری، مانیتورینگ و مقیاس‌پذیری را از دوش دولوپرها برداشته‌اند.

علاوه بر این‌ها، نسل بعدی MySQL به سمت Serverless شدن می‌رود. یعنی چه؟ یعنی اینکه شما پایگاه داده را به‌عنوان یک سرویس مصرف می‌کنید و فقط به اندازه استفاده خود هزینه پرداخت می‌کنید. بی‌نظیر است، نه؟

یادگیری MySQL

تسلط بر MySQL یک مهارت ضروری برای هر برنامه‌نویس است. در این مقاله شما فراگرفتید که:

  • MySQL چیست و چه فرقی با SQL دارد.
  • چگونه کار می‌کند (از لحظه زدن کوئری تا دریافت نتیجه).
  • مزایا و معایب آن در مقایسه با سایر پایگاه‌داده‌ها چیست
  • آینده MySQL چگونه است

قدم بعدی شما این است که همین لحظه XAMPP را نصب کنید و یک دیتابیس ایجاد کنید. از قدیم گفته‌اند که «عالم بدون عمل به هیچ دردی نمی‌خورَد!». زمان طلاست و آن را از دست ندهید. پیشنهاد می‌کنیم آموزش MySQL را با یکی از این دو دوره آموزشی شروع کنید:

آموزش مقدماتی MySQL (رایگان)

آموزش MYSQL مقدماتی تا پیشرفته (Zero to Hero)

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.