یادم می‌آید سال‌ها پیش، یک فایل متنی روی دسکتاپم داشتم به نام mysql-commands.txt که هر دستوری که یاد می‌گرفتم، در آن می‌نوشتم. فایل کم‌کم بزرگ شد، ولی اکثر آن دستورات را هیچ‌وقت استفاده نکردم. آنچه واقعاً هر روز به آن برمی‌گشتم، یک هسته‌ی کوچک بود: وصل شدن، ساختن جدول، کوئری زدن، ایندکس گذاشتن و عیب‌یابی. بقیه، یا خیلی تخصصی بودند یا در ابزارهای گرافیکی مثل phpMyAdmin جای بهتری داشتند. دستورات پرکاربرد MySQL دقیقاً همین هسته‌ی کوچک است — ابزاری که وقتی در سرور فقط SSH دارید و باید در سه دقیقه یک مشکل را حل کنید، تفاوت بین خونسردی و سردرگمی است. در این مقاله، همان دستوراتی را مرور می‌کنم که در پروژه‌های واقعی هر روز استفاده می‌کنم — با دلیل استفاده و نکات عملی هرکدام.

اتصال به MySQL و مدیریت کاربران

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

اتصال به سرور

# اتصال با کاربر و رمز
mysql -u root -p

# اتصال مستقیم به یک دیتابیس خاص
mysql -u db_user -p mydb

# اتصال به سرور خارجی
mysql -h 192.168.1.10 -P 3306 -u db_user -p

# اجرای یک فایل SQL
mysql -u db_user -p mydb < backup.sql

# اجرای یک کوئری مستقیم بدون ورود به محیط
mysql -u db_user -p mydb -e "SELECT COUNT(*) FROM users"

نکته‌ی مهمی که در پروژه‌های واقعی به آن رسیده‌ام: گزینه‌ی -e برای اسکریپت‌های اتوماسیون بی‌نظیر است. وقتی می‌خواهید یک کوئری سریع در یک اسکریپت bash بزنید، بدون ورود به محیط MySQL، همین یک گزینه کافی است. اگر با سرورهای لینوکسی کار می‌کنید، اصول اتصال از راه دور را در محدودسازی دسترسی خارجی به دیتابیس با جزئیات آورده‌ام.

خروج از محیط

exit;
-- یا
quit;
-- یا کلید Ctrl+D

دستورات مدیریت دیتابیس

-- مشاهده دیتابیس‌های موجود
SHOW DATABASES;

-- ساخت دیتابیس با charset مناسب
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- انتخاب دیتابیس فعال
USE mydb;

-- دیدن دیتابیس فعال
SELECT DATABASE();

-- حذف دیتابیس (خطرناک!)
DROP DATABASE mydb;

دو نکته‌ی حیاتی در همین چند خط:

  • utf8mb4 نه utf8: اگر با متن فارسی کار می‌کنید، این تفاوت در ماه ششم خودش را نشان می‌دهد. تفاوت این دو در رفع خطای Incorrect string value در MySQL با مثال توضیح داده شده.
  • DROP DATABASE فقط با بکاپ: این دستور برگشت‌پذیر نیست. حتی اگر مطمئن هستید، اول mysqldump بگیرید. اصول پشتیبان‌گیری در پشتیبان‌گیری از MySQL آمده است.
در MySQL، دستورات «نمایش» (SHOW) دوست شماست؛ دستورات «حذف» (DROP) دشمن شماست اگر همیشه اول SHOW نزنید.

دستورات مدیریت جدول

مشاهده ساختار

-- فهرست جدول‌های دیتابیس
SHOW TABLES;

-- ساختار یک جدول
DESCRIBE users;
-- یا
SHOW COLUMNS FROM users;

-- دستور کامل ساخت جدول
SHOW CREATE TABLE users;

SHOW CREATE TABLE یکی از مفیدترین دستورات است که کمتر استفاده می‌شود. وقتی می‌خواهید یک جدول را در دیتابیس دیگری بسازید یا ساختار یک جدول موجود را در تیم به اشتراک بگذارید، این یک دستور کافی است.

ساخت جدول

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(150) NOT NULL UNIQUE,
    age INT DEFAULT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

تغییر ساختار جدول

-- افزودن ستون
ALTER TABLE users ADD COLUMN phone VARCHAR(20) AFTER email;

-- حذف ستون
ALTER TABLE users DROP COLUMN phone;

-- تغییر نوع ستون
ALTER TABLE users MODIFY COLUMN name VARCHAR(150) NOT NULL;

-- تغییر نام ستون
ALTER TABLE users CHANGE COLUMN name full_name VARCHAR(150);

-- افزودن ایندکس
ALTER TABLE users ADD INDEX idx_name (full_name);

یک هشدار عملی از تجربه: ALTER TABLE روی جدول‌های بزرگ (چند میلیون رکورد) می‌تواند دقایق یا ساعت‌ها طول بکشد و در این مدت، جدول قفل باشد. اگر با جدول‌های حجیم کار می‌کنید، این کار را در ساعت کم‌ترافیک انجام دهید و اصول کاربردی این نوع تغییرات را در بهینه‌سازی جداول MySQL مرور کنید.

حذف جدول

-- حذف جدول (برگشت‌پذیر نیست)
DROP TABLE users;

-- حذف جدول فقط اگر وجود داشته باشد (امن‌تر)
DROP TABLE IF EXISTS users;

-- پاک کردن داده‌ها ولی حفظ ساختار
TRUNCATE TABLE users;

تفاوت مهم TRUNCATE و DELETE: TRUNCATE سریع‌تر است ولی برگشت‌پذیر نیست و شمارنده‌ی AUTO_INCREMENT را هم ریست می‌کند. اگر می‌خواهید داده‌ها را پاک کنید ولی ساختار و شمارنده را نگه دارید، از DELETE FROM users استفاده کنید.

دستورات داده (CRUD)

Insert: درج داده

-- درج یک رکورد
INSERT INTO users (name, email, age)
VALUES ("Ali", "ali@example.com", 30);

-- درج چند رکورد
INSERT INTO users (name, email, age) VALUES
    ("Sara", "sara@example.com", 25),
    ("Reza", "reza@example.com", 35);

-- درج از یک کوئری
INSERT INTO users_backup (name, email)
SELECT name, email FROM users WHERE active = 1;

Select: خواندن داده

-- خواندن همه رکوردها
SELECT * FROM users;

-- خواندن با شرط
SELECT id, name, email FROM users WHERE age > 18;

-- خواندن با ترتیب و محدودیت
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;

-- شمارش رکوردها
SELECT COUNT(*) FROM users;

Update: به‌روزرسانی

-- به‌روزرسانی یک رکورد
UPDATE users SET age = 31 WHERE id = 1;

-- به‌روزرسانی چند رکورد
UPDATE users SET active = 0 WHERE last_login < "2026-01-01";

-- به‌روزرسانی با محاسبه
UPDATE users SET orders_count = orders_count + 1 WHERE id = 1;

Delete: حذف داده

-- حذف یک رکورد خاص
DELETE FROM users WHERE id = 1;

-- حذف گروهی
DELETE FROM users WHERE created_at < "2026-01-01" AND active = 0;

یک قاعده‌ی طلایی که در پروژه‌های واقعی هر روز به آن پایبندم: همیشه قبل از UPDATE یا DELETE، یک SELECT با همان WHERE بزنید. با این کار، قبل از اجرا می‌بینید کدام رکوردها هدف قرار می‌گیرند. این چند ثانیه، تفاوت بین یک ویرایش تمیز و یک بحران است.

دستورات کوئری پیشرفته

JOIN بین جدول‌ها

-- INNER JOIN (فقط رکوردهای مشترک)
SELECT u.name, o.total
FROM users u
INNER JOIN orders o ON u.id = o.user_id
WHERE o.created_at >= "2026-01-01";

-- LEFT JOIN (همه کاربران، حتی بدون سفارش)
SELECT u.name, COUNT(o.id) AS order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.name;

گروه‌بندی و تجمیع

-- شمارش مشتریان به تفکیک شهر
SELECT city, COUNT(*) AS user_count
FROM users
GROUP BY city
HAVING user_count > 10
ORDER BY user_count DESC;

Subquery و EXISTS

-- کاربرانی که حداقل یک سفارش دارند
SELECT * FROM users
WHERE EXISTS (
    SELECT 1 FROM orders WHERE orders.user_id = users.id
);

-- کاربرانی که هیچ سفارشی ندارند
SELECT * FROM users
WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);

نکته‌ی مهم در انتخاب بین IN و EXISTS: برای زیرکوئری‌های بزرگ، EXISTS معمولاً سریع‌تر است چون در اولین تطبیق متوقف می‌شود. برای زیرکوئری‌های کوچک، تفاوت محسوس نیست. اگر با کوئری‌های سنگین درگیرید، اصول بهینه‌سازی در بهینه‌سازی کوئری‌های MySQL نکات دقیق‌تری دارد.

دستورات ایندکس

-- افزودن ایندکس به یک ستون
CREATE INDEX idx_email ON users (email);

-- افزودن ایندکس یکتا
CREATE UNIQUE INDEX idx_email_unique ON users (email);

-- افزودن ایندکس ترکیبی
CREATE INDEX idx_name_city ON users (name, city);

-- مشاهده ایندکس‌های یک جدول
SHOW INDEX FROM users;

-- حذف ایندکس
DROP INDEX idx_email ON users;

-- افزودن ایندکس هنگام ساخت جدول
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(150),
    INDEX idx_email (email)
);

چهار نکته‌ی مهم در ایندکس که در پروژه‌های واقعی به آن‌ها رسیده‌ام:

  • ستون‌های WHERE، JOIN و ORDER BY: این سه، کاندیدای اصلی ایندکس هستند.
  • ایندکس ترکیبی از چپ به راست: ایندکس روی (a, b)، برای فیلتر روی a کار می‌کند ولی برای فیلتر فقط روی b، نه.
  • ایندکس‌های اضافی، هزینه دارند: هر ایندکس، سرعت INSERT و UPDATE را کم می‌کند چون باید جداگانه به‌روز شود.
  • LIKE با % در ابتدا، از ایندکس استفاده نمی‌کند: LIKE "%text" ایندکس را نادیده می‌گیرد، ولی LIKE "text%" از آن بهره می‌برد.

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

دستورات دسترسی و مجوز

-- فهرست کاربران موجود
SELECT user, host FROM mysql.user;

-- ساخت کاربر جدید
CREATE USER "db_user"@"localhost" IDENTIFIED BY "strong_password";

-- اعطای مجوز روی یک دیتابیس
GRANT ALL PRIVILEGES ON mydb.* TO "db_user"@"localhost";

-- اعطای مجوز فقط برای خواندن
GRANT SELECT ON mydb.* TO "reader"@"localhost";

-- اعمال تغییرات
FLUSH PRIVILEGES;

-- مشاهده مجوزهای یک کاربر
SHOW GRANTS FOR "db_user"@"localhost";

-- لغو مجوز
REVOKE INSERT ON mydb.* FROM "db_user"@"localhost";

-- تغییر رمز عبور
ALTER USER "db_user"@"localhost" IDENTIFIED BY "new_password";

-- حذف کاربر
DROP USER "db_user"@"localhost";

سه نکته‌ی امنیتی که در پروژه‌های واقعی رویشان تأکید می‌کنم:

  • کاربر root را برای پروژه‌های واقعی استفاده نکنید: برای هر پروژه، یک کاربر با دسترسی محدود به همان دیتابیس بسازید.
  • میان % و localhost تفاوت بگذارید: "user"@"%" یعنی از هر IP قابل دسترسی است؛ "user"@"localhost" فقط از همان سرور. برای امنیت بیشتر، همان localhost کافی است.
  • مجوز حداقل: به هر کاربر فقط همان مجوزهایی را بدهید که واقعاً نیاز دارد. مثلاً یک برنامه‌ی فقط خواندنی، نباید مجوز DROP داشته باشد.

اصول کامل امنیت MySQL در بهترین روش‌های امنیت MySQL و برای پروژه‌های وردپرسی در امنیت دیتابیس وردپرس آمده است.

در MySQL، هر کاربری که مجوز بیشتری از نیازش دارد، یک درِ پشتی باز گذاشته است؛ مجوز حداقل، امنیت حداکثر.

دستورات پشتیبان‌گیری و بازیابی

پشتیبان‌گیری با mysqldump

# بکاپ یک دیتابیس
mysqldump -u db_user -p mydb > mydb_backup.sql

# بکاپ با ساختار و داده
mysqldump -u db_user -p --routines --triggers --events mydb > mydb_full_backup.sql

# بکاپ همه دیتابیس‌ها
mysqldump -u root -p --all-databases > all_databases.sql

# بکاپ فقط ساختار بدون داده
mysqldump -u db_user -p --no-data mydb > mydb_schema.sql

# بکاپ فقط داده بدون ساختار
mysqldump -u db_user -p --no-create-info mydb > mydb_data.sql

# بکاپ فشرده
mysqldump -u db_user -p mydb | gzip > mydb_backup.sql.gz

بازیابی

# بازیابی از فایل SQL
mysql -u db_user -p mydb < mydb_backup.sql

# بازیابی از فایل فشرده
gunzip < mydb_backup.sql.gz | mysql -u db_user -p mydb

# ساخت دیتابیس و بازیابی
mysql -u root -p -e "CREATE DATABASE mydb CHARACTER SET utf8mb4"
mysql -u root -p mydb < mydb_backup.sql

سه نکته‌ی حیاتی در بکاپ که در پروژه‌های واقعی به آن‌ها رسیده‌ام:

  • بکاپ فقط وقتی معنی دارد که بازگردانی‌اش تست شده باشد: یک بکاپ بدون تست بازیابی، توهم امنیت است. حداقل یک بار در ماه، بازیابی را روی یک دیتابیس تستی امتحان کنید.
  • بکاپ را در جای دیگر نگه دارید: بکاپی که روی همان سرور است، در فاجعه‌ی دیسک یا هک، از دست می‌رود.
  • بکاپ بزرگ، فشرده‌اش کنید: gzip می‌تواند حجم را تا ۸۰٪ کاهش دهد. برای سایت‌های بزرگ، این تفاوت در زمان انتقال و فضای دیسک محسوس است.

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

دستورات اطلاعات و عیب‌یابی

اطلاعات سرور و اتصال

-- نسخه MySQL
SELECT VERSION();

-- کاربر فعلی
SELECT USER();
SELECT CURRENT_USER();

-- دیتابیس فعال
SELECT DATABASE();

-- متغیرهای سیستم (فیلترشده)
SHOW VARIABLES LIKE "%charset%";
SHOW VARIABLES LIKE "max_connections";

-- وضعیت سرور
SHOW STATUS LIKE "Threads_connected";
SHOW STATUS LIKE "Uptime";

مشاهده پروسه‌های فعال

-- فهرست پروسه‌های در حال اجرا
SHOW PROCESSLIST;

-- پروسه‌های طولانی
SELECT * FROM information_schema.PROCESSLIST
WHERE Time > 10
ORDER BY Time DESC;

-- کشتن یک پروسه (اگر واقعاً لازم است)
KILL 12345;

SHOW PROCESSLIST یکی از مفیدترین دستورات در عیب‌یابی است. وقتی سایت کند می‌شود یا کوئری‌ها پاسخ نمی‌دهند، این دستور نشان می‌دهد چه کوئری‌هایی در حال اجرا هستند و کدام‌شان ساعت‌ها منتظر مانده. در پروژه‌های واقعی، بارها با همین دستور یک کوئری گیرکرده را پیدا کرده‌ام.

حجم دیتابیس و جدول‌ها

-- حجم دیتابیس‌ها
SELECT
    table_schema AS "Database",
    ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)"
FROM information_schema.TABLES
GROUP BY table_schema;

-- حجم جدول‌های یک دیتابیس
SELECT
    table_name,
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)",
    table_rows
FROM information_schema.TABLES
WHERE table_schema = "mydb"
ORDER BY (data_length + index_length) DESC
LIMIT 10;

این کوئری‌ها، در پروژه‌های واقعی، اولین جایی هستند که سراغشان می‌روم وقتی دیسک سرور پر می‌شود. معمولاً یک یا دو جدول بزرگ، بیشتر فضا را اشغال می‌کنند — مثل جدول لاگ‌ها یا sessionها. پیدا کردنشان، اولین قدم برای پاکسازی هوشمند است.

دستورات بهینه‌سازی و تحلیل

EXPLAIN: تحلیل کوئری

EXPLAIN SELECT * FROM users WHERE email = "ali@example.com";

-- تحلیل دقیق‌تر
EXPLAIN ANALYZE SELECT * FROM users WHERE age > 30;

خروجی EXPLAIN چهار ستون مهم دارد که در پروژه‌های واقعی به آن‌ها نگاه می‌کنم:

ستونمعنینکته
typeنوع جستجوALL بد (اسکن کامل)، ref یا const خوب
keyایندکس استفاده‌شدهNULL یعنی ایندکس استفاده نشده
rowsتعداد رکوردهای بررسی‌شدههرچه کمتر، بهتر
Extraاطلاعات تکمیلیUsing filesort یا Using temporary هشدار

اگر در خروجی EXPLAIN، ستون type مقدار ALL دارد، یعنی MySQL کل جدول را اسکن می‌کند. این یک سیگنال قرمز برای اضافه‌کردن ایندکس است. اگر Extra حاوی Using filesort باشد، یعنی ORDER BY شما ایندکس ندارد. اصول کامل تحلیل EXPLAIN در بهینه‌سازی کوئری‌های MySQL آمده است.

بهینه‌سازی جدول

-- بهینه‌سازی (بازسازی فیزیکی)
OPTIMIZE TABLE users;

-- تحلیل آمار جدول (برای بهینه‌ساز)
ANALYZE TABLE users;

-- بررسی سلامت جدول
CHECK TABLE users;

-- تعمیر جدول خراب
REPAIR TABLE users;

تفاوت این چهار دستور مهم است:

  • OPTIMIZE TABLE: فضای هدررفته را آزاد می‌کند. بعد از حذف رکوردهای زیاد، مفید است. ولی روی جدول‌های بزرگ، زمان‌بر است و جدول را قفل می‌کند.
  • ANALYZE TABLE: آمار جدول را برای بهینه‌ساز می‌سازد. بعد از تغییرات زیاد در جدول، مفید است.
  • CHECK TABLE: سلامت فیزیکی جدول را بررسی می‌کند.
  • REPAIR TABLE: جدول‌های خراب را تعمیر می‌کند. برای InnoDB، معمولاً جایگزین‌هایی مثل dump و restore امن‌تر است.

مشاهده کوئری‌های کند

-- فعال‌سازی لاگ کوئری‌های کند
SET GLOBAL slow_query_log = "ON";
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = "/var/log/mysql/slow.log";

-- مشاهده تنظیمات فعلی
SHOW VARIABLES LIKE "%slow%";

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

دستورات charset و انکودینگ

-- مشاهده charset دیتابیس
SELECT default_character_set_name, default_collation_name
FROM information_schema.SCHEMATA
WHERE schema_name = "mydb";

-- مشاهده charset جدول
SHOW CREATE TABLE users;

-- مشاهده charset ستون
SELECT column_name, character_set_name, collation_name
FROM information_schema.COLUMNS
WHERE table_schema = "mydb" AND table_name = "users";

-- تغییر charset دیتابیس
ALTER DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- تغییر charset جدول
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- تنظیم charset اتصال
SET NAMES utf8mb4;

برای مخاطب فارسی‌زبان، این دستورات حیاتی هستند. اگر با خطای Incorrect string value روبرو شده‌اید یا متن فارسی به‌شکل کاراکترهای عجیب ذخیره می‌شود، مشکل تقریباً همیشه در یکی از سه سطح charset است: دیتابیس، جدول یا اتصال. اگر بعد از تغییر charset، متن‌های قدیمی درست نمایش داده نمی‌شوند، رفع خطای Incorrect string value در MySQL مسیر دقیق مهاجرت را نشان می‌دهد. اگر با پایتون کار می‌کنید، اتصال پایتون به MySQL نحوه‌ی تنظیم charset در اتصال را توضیح می‌دهد.

اشتباهاتی که در استفاده از این دستورات دیده‌ام

در بازبینی استفاده‌ی تیم‌ها از MySQL، این اشتباهات را زیاد دیده‌ام:

  • UPDATE یا DELETE بدون WHERE: فاجعه‌ی کلاسیک. کل جدول تغییر می‌کند یا حذف می‌شود. همیشه اول یک SELECT با همان شرط بزنید.
  • DROP DATABASE بدون بکاپ: برگشت‌پذیر نیست. حتی در محیط توسعه، عادت کنید اول بکاپ بگیرید.
  • استفاده از SELECT * در همه‌جا: هم حجم داده را بالا می‌برد و هم از ایندکس پوششی جلوگیری می‌کند. همیشه ستون‌های واقعاً مورد نیاز را انتخاب کنید.
  • فراموش کردن FLUSH PRIVILEGES: بعد از تغییر مجوزها، بدون این دستور، تغییرات اعمال نمی‌شوند.
  • charset پیش‌فرض latin1: برای متن فارسی، این باعث ذخیره‌ی نادرست یا خطا می‌شود. همیشه utf8mb4.
  • نادیده‌گرفتن EXPLAIN: کوئری را می‌نویسند و می‌زنند، بدون این‌که ببینند چه اتفاقی می‌افتد. روی جدول‌های کوچک تفاوت نیست، ولی روی جدول‌های بزرگ، EXPLAIN تفاوت بین ثانیه و دقیقه است.
  • OPTIMIZE TABLE در ساعت شلوغی: جدول را قفل می‌کند و سایت را کند. همیشه در ساعت کم‌ترافیک.
  • kill کردن پروسه بدون بررسی: قبل از KILL، مطمئن شوید پروسه واقعاً گیر کرده و یک تراکنش مهم نیست. کشتن تراکنش در میانه، می‌تواند داده‌ی نیمه‌کاره بگذارد.
  • نبود لاگ کوئری کند: بدون slow_query_log، کوئری‌های کند بی‌صدا هستند و فقط در بحران خودشان را نشان می‌دهند.
  • بکاپ بدون تست بازیابی: یک بکاپ که بازگردانی‌اش تست نشده، فقط فایل است، نه بکاپ.
  • استفاده از root برای برنامه: اگر کد برنامه هک شود، مهاجم به همه‌چیز دسترسی دارد. برای هر برنامه، کاربر با مجوز حداقل بسازید.

یک توصیه‌ی عملی از تجربه: این دستورات را در یک فایل mysql-cheatsheet.md در مخزن پروژه نگه دارید و آن را در تیم به اشتراک بگذارید. هر تیم، بعد از چند ماه، دستوراتی مخصوص به پروژه‌ی خودش پیدا می‌کند که ارزش نگه‌داشتن دارند. اگر با PHP کار می‌کنید، اتصال PHP به MySQL و آموزش PDO در PHP نمونه‌های عملی از این دستورات را در بستر یک زبان نشان می‌دهند.

سخن آخر

دستورات پرکاربرد MySQL، فهرست بلندی نیست؛ یک هسته‌ی کوچک است که در هر پروژه‌ای بارها تکرار می‌شود. سه نکته‌ی اصلی که در این مقاله به آن‌ها رسیدیم: اول، دستورات «نمایش» و «تحلیل» را به‌اندازه‌ی دستورات «تغییر» جدی بگیرید — SHOW، EXPLAIN، DESCRIBE، ابزارهای اصلی شما برای فهم وضعیت دیتابیس هستند؛ دوم، قبل از هر UPDATE، DELETE، DROP یا ALTER، یک SELECT با همان شرط بزنید — این عادت، جلوی بسیاری از بحران‌ها را می‌گیرد؛ سوم، بکاپ بگیرید و بازیابی را تست کنید — یک دیتابیس بدون بکاپ، یک قمار است.

اگر امروز می‌خواهید این فهرست را در عمل تست کنید، سه کار کوچک پیشنهاد می‌کنم: یک دیتابیس تستی با utf8mb4 بسازید، یک جدول ساده ایجاد کنید، و روی همان جدول، EXPLAIN را برای یک کوئری با و بدون ایندکس امتحان کنید. تفاوت خروجی type، همان درسی است که بیشتر از هر کتابی، اهمیت ایندکس را جا می‌اندازد. اگر تجربه‌ای از استفاده از این دستورات در پروژه‌های خودتان دارید — مخصوصاً اگر با ابزار یا دستوری روبرو شده‌اید که در این فهرست نیست ولی هر روز استفاده می‌کنید — در دیدگاه‌ها بنویسید؛ همین نکته‌های میدانی، برای خواننده‌ی بعدی از هر مستند رسمی ارزشمندتر است. 🗄️