اتصال به سرور MySQL
گزینههای host، port و user را صریح بدهید؛ برای رمز از prompt یا secret manager استفاده کنید، نه قرار دادن رمز در فرمان.
mysql -h db.example.test -P 3306 -u app_user -p
راهنمای عملی MySQL برای اتصال، تعریف schema، query، رابطهها، تراکنش، ایندکس و پشتیبانگیری. چیتشیت MySQL با فرمانهای اتصال و مدیریت پایگاه داده آغاز میشود. در shell فقط به سرور مورداعتماد وصل شوید، رمز را در history یا اسکریپت ثبت نکنید و پیش از حذف یا بازیابی، نام محیط و مقصد را دوباره بررسی کنید. نوع دادهٔ دقیق، کلید اصلی و constraintها جلوی دادهٔ ناسازگار را در همان پایگاه داده میگیرند. برای متن از charset مناسب، برای مبلغ از `DECIMAL` و برای زمان از نوعی متناسب با نیاز timezone استفاده کنید. از این صفحه بهعنوان مرجع سریع استفاده کنید و مثالها و نکتهها را با نسخهٔ ابزار، نیاز و شرایط واقعی پروژهٔ خود تطبیق دهید.
گزینههای host، port و user را صریح بدهید؛ برای رمز از prompt یا secret manager استفاده کنید، نه قرار دادن رمز در فرمان.
mysql -h db.example.test -P 3306 -u app_user -pنام schema را مشخص و connection را با نمونهٔ زیر به پایگاه دادهٔ هدف ببرید.
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;SHOW DATABASES;USE app_db;پیش از تغییر schema، جدولهای موجود و تعریف واقعی ستونها را بررسی کنید.
SHOW TABLES;DESCRIBE users;SHOW CREATE TABLE users;فرمانهای زیر را در shell اجرا کنید؛ backup را رمزگذاری و بازیابی را در محیط آزمایشی دورهای تمرین کنید.
mysqldump -u backup_user -p app_db > app_db.sqlmysql -u restore_user -p app_db < app_db.sqlشناسهٔ پایدار و قیدهای لازم را هنگام ایجاد جدول تعریف کنید؛ پیشفرضها باید با قواعد دامنه هماهنگ باشند.
CREATE TABLE users ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, email VARCHAR(255) NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (id), UNIQUE KEY users_email_unique (email));کلید خارجی را برای تضمین ارجاع معتبر تعریف کنید و رفتار حذف یا بهروزرسانی را آگاهانه انتخاب کنید.
CREATE TABLE orders ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, user_id BIGINT UNSIGNED NOT NULL, total DECIMAL(10, 2) NOT NULL, PRIMARY KEY (id), CONSTRAINT orders_user_fk FOREIGN KEY (user_id) REFERENCES users (id));migration نسخهپذیر را برای تغییر schema بهکار ببرید؛ روی جدول بزرگ ابتدا هزینهٔ lock و زمان اجرا را بسنجید.
ALTER TABLE users ADD COLUMN display_name VARCHAR(120) NULL, ADD INDEX users_created_at_idx (created_at);فیلدهای لازم را انتخاب کنید؛ برای مقدار متغیر در برنامه از prepared statement استفاده کنید.
SELECT id, email, created_atFROM usersWHERE created_at >= ?ORDER BY created_at DESC, id DESCLIMIT 20;IN، BETWEEN و شرطهای منطقی را برای خوانایی بهکار ببرید؛ معنای NULL را با IS NULL بررسی کنید.
SELECT id, status, totalFROM ordersWHERE status IN ('paid', 'shipped') AND total BETWEEN 100.00 AND 500.00 AND cancelled_at IS NULL;در فهرست کوچک، نمونهٔ زیر ساده است؛ برای جدولهای بسیار بزرگ pagination مبتنی بر کلید آخر را بررسی کنید.
SELECT id, titleFROM postsWHERE id < ?ORDER BY id DESCLIMIT 25;ستونها را صریح نام ببرید و مقدارهای کاربر را در prepared statement ارسال کنید.
INSERT INTO users (email, display_name)VALUES (?, ?);شرط کلید اصلی یا قید دامنه را در UPDATE قرار دهید و تعداد ردیفهای تغییرکرده را بررسی کنید.
UPDATE usersSET display_name = ?WHERE id = ?;پیش از DELETE همان شرط را با SELECT بسنجید؛ در عملیات حساس از transaction و تأیید مناسب استفاده کنید.
DELETE FROM sessionsWHERE expires_at < CURRENT_TIMESTAMP;در MySQL از نمونهٔ زیر استفاده کنید؛ تکرار را با کلید یکتا تعریفشده کنترل کنید.
INSERT INTO settings (setting_key, setting_value)VALUES ('theme', 'dark') AS incomingON DUPLICATE KEY UPDATE setting_value = incoming.setting_value;نوع JOIN را براساس نیاز انتخاب کنید؛ LEFT JOIN ردیف سمت چپ را حتی بدون تطبیق نگه میدارد.
SELECT users.email, orders.totalFROM usersJOIN orders ON orders.user_id = users.idWHERE orders.status = 'paid';هر ستون غیرتجمیعی را مطابق قواعد SQL در GROUP BY بیاورید و گروه را با HAVING فیلتر کنید.
SELECT user_id, COUNT(*) AS order_count, SUM(total) AS revenueFROM ordersGROUP BY user_idHAVING COUNT(*) >= 2;CASE دستهبندی محاسباتی میسازد؛ مقدار تهی را با نمونهٔ زیر به شکل مشخص مدیریت کنید.
SELECT COALESCE(status, 'unknown') AS status_label, SUM(CASE WHEN total >= 100 THEN 1 ELSE 0 END) AS large_ordersFROM ordersGROUP BY COALESCE(status, 'unknown');EXPLAIN نشان میدهد MySQL چه مسیر دسترسی را برگزیده است؛ در نسخههای پشتیبان، EXPLAIN ANALYZE زمان اجرای واقعی را نیز اندازه میگیرد.
EXPLAINSELECT id, emailFROM usersWHERE email = 'person@example.test';تغییرهای وابسته را در یک transaction انجام دهید و در صورت خطا rollback کنید.
START TRANSACTION;UPDATE accounts SET balance = balance - 25 WHERE id = 1;UPDATE accounts SET balance = balance + 25 WHERE id = 2;COMMIT;وضعیت سرور را برای عیبیابی مشاهده کنید؛ فرمان مخرب نمونهٔ زیر را تنها برای connection شناختهشده و مجاز اجرا کنید.
SHOW PROCESSLIST;SHOW STATUS LIKE 'Threads_connected';در اتصال از host، port و user مشخص استفاده کنید و رمز را در فرمان یا تاریخچهٔ shell ننویسید.
پایگاه داده را با utf8mb4 بسازید و پیش از اجرای DDL، مقصد و محیط را تأیید کنید.
برای جدولها primary key، نوع دقیق و constraintهای یکتا و ارجاعی تعریف کنید.
در query فقط ستونهای لازم را بخوانید و مقدارهای بیرونی را با prepared statement bind کنید.
برای queryهای رابطهای، نوع JOIN و کلید پیوند را روشن انتخاب کنید.
ایندکس را با الگوی واقعی فیلتر و ترتیب query هماهنگ و هزینهٔ نوشتن را نیز ارزیابی کنید.
تغییرهای چندمرحلهای را در transaction انجام دهید و در خطا rollback کنید.
با EXPLAIN طرح query را ببینید و برای backup و restore تمرین دورهای داشته باشید.
برای مبادلهٔ داده از utf8mb4 استفاده کنید و collation را با نیاز مقایسه و مرتبسازی متن هماهنگ کنید.
برای جابهجایی پول DECIMAL را به FLOAT ترجیح دهید و در schema برای رابطهها و یکتایی constraint واقعی بسازید.