連線
mysql -h <host> -P <port> -u <user> -p <db>開啟互動式 MySQL 用戶端工作階段。
-h 主機;-P 預設 3306;-u 使用者;-p 密碼;-D 資料庫;-e 命令;-f 強制繼續;--safe-updates
mysql -h mysql.internal -u app -p app_productionmysql -u root -p -e "SHOW DATABASES;"在 shell 中直接執行一條或多條 SQL,不必進入 REPL。
--tee 檔案 擷取輸出;--html HTML 格式;--table Tab 分隔
mysql -u root -p -e "SHOW SLAVE STATUS\G"中繼資料與資訊
SHOW DATABASES列出使用者可見的所有資料庫。
SHOW SCHEMAS 為同義詞
SHOW DATABASES LIKE 'app%';SHOW TABLES / DESCRIBE列出當前資料庫的資料表;DESCRIBE 顯示單一資料表的欄位。
SHOW FULL TABLES;DESCRIBE t;SHOW COLUMNS FROM t
SHOW FULL TABLES WHERE Table_type != 'BASE TABLE';SHOW CREATE TABLE <t>輸出能重建該資料表的完整 SQL——遷移時很好用。
SHOW CREATE TABLE orders\GEXPLAIN <statement>顯示查詢計畫與索引使用情況。可加上 FORMAT=JSON 供工具讀取。
EXPLAIN FORMAT=JSON;EXPLAIN ANALYZE(MySQL 8.0+)會實際執行;EXTENDED/traditional 已棄用
EXPLAIN SELECT * FROM orders WHERE user_id = 42 ORDER BY created_at DESC LIMIT 10;SHOW STATUS / SHOW VARIABLES檢視伺服器的健康計數器與可調參數。
SHOW GLOBAL STATUS LIKE 'Threads_running';SHOW VARIABLES LIKE 'innodb_buffer_pool_size%';
SHOW GLOBAL STATUS LIKE 'Slow_queries';資料庫與 Schema
CREATE DATABASE <db>建立新資料庫,可選擇字元集與定序。
CHARACTER SET utf8mb4;COLLATE utf8mb4_0900_ai_ci;ENCRYPTION 'Y'(8.0.16+)
CREATE DATABASE app_dev CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;USE <db> / DROP DATABASE <db>切換預設資料庫,或刪除既有資料庫。
USE 會清空上次結果並設定 DB;DROP DATABASE 無法復原
DROP DATABASE IF EXISTS app_old;資料表與 DDL
CREATE TABLE定義新資料表——欄位、鍵、預設值與儲存引擎選項。
ENGINE=InnoDB;DEFAULT CHARSET=utf8mb4;AUTO_INCREMENT=<n>;KEY/UNIQUE/PRIMARY KEY 約束
CREATE TABLE orders ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, user_id INT UNSIGNED NOT NULL, total DECIMAL(10,2) NOT NULL DEFAULT 0, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_user_created (user_id, created_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;ALTER TABLE新增/重新命名/刪除欄位與索引,更換引擎,設定選項。
ADD COLUMN;DROP COLUMN;MODIFY/ALTER COLUMN;ADD/DROP INDEX;RENAME;ORDER BY;ALGORITHM=INSTANT|INPLACE|COPY
ALTER TABLE orders ADD COLUMN status ENUM('pending','paid','cancelled') NOT NULL DEFAULT 'pending', ADD INDEX idx_status (status);DROP TABLE / TRUNCATE TABLE刪除資料表(CASCADE 為可選)或快速清空(會重置 AUTO_INCREMENT)。
DROP TABLE IF EXISTS;TRUNCATE TABLE;可暫時設 FOREIGN_KEY_CHECKS=0 跨表操作
TRUNCATE TABLE staging.events;RENAME TABLE <a> TO <b>原子重新命名——搭配影子表做熱切換很順手。
RENAME TABLE orders TO orders_old, orders_new TO orders;DML
INSERT INTO <t> [(cols)] VALUES ...插入一筆或多筆資料;多筆 INSERT 比逐筆 INSERT 快。
INSERT IGNORE;ON DUPLICATE KEY UPDATE(upsert);INSERT ... SELECT;LAST_INSERT_ID()
INSERT INTO orders(user_id, total) VALUES (1, 9.99), (1, 4.50), (2, 19.95);INSERT ... ON DUPLICATE KEY UPDATEUpsert——當唯一/主鍵衝突時改為更新;影響列數會回傳 2。
VALUES(col) 取舊/新值;LAST_INSERT_ID() 技巧串接 auto-increment
INSERT INTO counters(id, hits) VALUES (1, 1) ON DUPLICATE KEY UPDATE hits = hits + 1REPLACE INTO ...唯一鍵衝突時等同刪除後再插入的速記(已不建議的模式)。
REPLACE INTO settings(k, v) VALUES ('theme', 'dark')UPDATE / DELETE修改或刪除列。沒有 WHERE 時會影響整張表。
UPDATE ... ORDER BY ... LIMIT n;多表 UPDATE t1, t2 SET ... WHERE ...;ON DELETE CASCADE
UPDATE orders SET status='paid' WHERE user_id = 42 AND status='pending' ORDER BY created_at LIMIT 100;DELETE ... ORDER BY ... LIMIT N緩慢刪除大批資料,避免 undo 檔與鎖定時間過長。
LIMIT N;重複執行迴圈;若是全表可考慮 TRUNCATE
DELETE FROM events WHERE created_at < now() - INTERVAL 30 DAY ORDER BY id LIMIT 5000查詢與篩選
SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ... OFFSET ...讀取資料列,搭配篩選、排序、分頁。
DISTINCT;IN (子查詢) / ANY / ALL;BETWEEN;IS NULL;REGEXP;STRAIGHT_JOIN 提示
SELECT id, status FROM orders WHERE user_id = 42 AND status IN ('paid','shipped') ORDER BY created_at DESC LIMIT 10 OFFSET 20;GROUP BY ... HAVING ...彙總資料,再對彙總結果做篩選。
sql_mode=ONLY_FULL_GROUP_BY(8.0+);WITH ROLLUP 加上總計列
SELECT user_id, count(*) AS n, sum(total) AS gmv FROM orders GROUP BY user_id HAVING count(*) >= 3 ORDER BY gmv DESC LIMIT 50;連接
[INNER | LEFT | RIGHT | CROSS] JOIN ... ON ...合併多張資料表的列。
STRAIGHT_JOIN;USING(col);MySQL 8.0+ 才支援 nested-loop/hash join;JSON_TABLE
SELECT u.email, count(o.id) FROM users u LEFT JOIN orders o ON o.user_id = u.id GROUP BY u.email ORDER BY count(o.id) DESC;WITH cte AS (...) SELECT ...Common Table Expression——8.0 起支援遞迴。
WITH RECURSIVE org AS (SELECT id, manager_id, name FROM staff WHERE manager_id IS NULL UNION ALL SELECT s.id, s.manager_id, s.name FROM staff s JOIN org o ON s.manager_id = o.id) SELECT * FROM org;彙總
COUNT() / SUM() / AVG() / MIN() / MAX() / GROUP_CONCAT()內建的彙總函式。
COUNT(DISTINCT x);GROUP_CONCAT(col ORDER BY col SEPARATOR ',')
SELECT day(created_at) AS d, sum(total) AS gmv, count(*) AS n FROM orders GROUP BY day(created_at) ORDER BY d DESC LIMIT 7;索引與視圖
CREATE INDEX ...新增次要索引以加速查找與 ORDER BY。
UNIQUE;FULLTEXT/SPATIAL(視儲存引擎);ON tbl(col, ...) 複合索引;INVISIBLE 旗標(8.0+);索引鍵可加 DESC
CREATE INDEX idx_user_created ON orders(user_id, created_at DESC) ALGORITHM=INPLACE LOCK=NONE;DROP INDEX / ALTER TABLE ... DROP INDEX移除索引。用 ALTER TABLE 可一次新增與刪除。
ALTER TABLE orders DROP INDEX idx_user_created;CREATE VIEW / CREATE OR REPLACE VIEW儲存 SELECT 定義;可更新的視圖在限制下支援 INSERT/UPDATE/DELETE。
CREATE OR REPLACE;WITH CHECK OPTION 強制寫入時符合 WHERE;ALGORITHM=MERGE|TEMPTABLE
CREATE OR REPLACE ALGORITHM=MERGE SQL SECURITY INVOKER VIEW v_user_orders AS SELECT user_id, count(*) AS n FROM orders GROUP BY user_id;交易
START TRANSACTION / COMMIT / ROLLBACK把陳述式包進 ACID 單元;預設為 autocommit(單陳述式不必包交易)。
START TRANSACTION WITH CONSISTENT SNAPSHOT;COMMIT;ROLLBACK TO SAVEPOINT
START TRANSACTION; UPDATE ...; ROLLBACK;SET autocommit = 0; SET TRANSACTION ISOLATION LEVEL ...關閉逐陳述式的 autocommit;可變更隔離層級:REPEATABLE READ(InnoDB 預設)、READ COMMITTED、READ UNCOMMITTED、SERIALIZABLE。
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; SET autocommit = 0;SELECT ... FOR UPDATE / LOCK IN SHARE MODE並發情境下用列級鎖定保護資料。8.0+ 提供 NOWAIT/SKIP LOCKED。
FOR UPDATE NOWAIT / SKIP LOCKED
SELECT id FROM jobs WHERE status='queued' ORDER BY id LIMIT 1 FOR UPDATE SKIP LOCKED;備份與還原
mysqldump -u <user> -p <db> > dump.sql邏輯備份:把 SQL INSERT/DDL 輸出到檔案。
--single-transaction 適用 InnoDB;--routines;--triggers;--no-data 僅結構;--add-drop-table;--column-statistics=0
mysqldump -u root -p --single-transaction --routines --triggers --events app > /backup/app-$(date +%F).sqlmysql -u root -p <db> < dump.sql把 SQL dump 重放到目標資料庫。
--force;--auto-rehash;--comments
mysql -u root -p app_new < /backup/app.sqlSOURCE /path/script.sql在 REPL 內執行 SQL 腳本。
source 最後一個陳述式不需分號結束;在 CLI 對應 \.
SOURCE /tmp/migrations/0002_add_index.sql;mysqlbinlog binlog.000001 > incr.sql把 binary log 轉成 SQL,用於 point-in-time recovery。
--start-datetime;--stop-datetime;--start-position;--stop-position
mysqlbinlog --start-datetime='2026-07-23 00:00:00' /var/lib/mysql/binlog.000123 > /inc.sql使用者與權限
CREATE USER / ALTER USER / DROP USER管理 MySQL 帳號。
IDENTIFIED BY '...';IDENTIFIED WITH caching_sha2_password;WITH MAX_CONNECTIONS 10;
CREATE USER 'reporting'@'%' IDENTIFIED BY 'P@ssw0rd!'; ALTER USER 'app'@'%' PASSWORD EXPIRE NEVER;GRANT / REVOKE物件與全域權限;組合決定實際能力。
GRANT SELECT ON app.* TO 'reporting'@'%';GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
GRANT SELECT, INSERT, UPDATE, DELETE ON app.* TO 'app'@'%';FLUSH PRIVILEGES手動修改授權表後重新載入記憶體中的副本(執行 GRANT 後不必再跑)。
FLUSH HOSTS / LOGS / TABLES
FLUSH PRIVILEGES;診斷
SHOW PROCESSLIST / KILL <id>檢視執行中的執行緒;KILL 掉卡住或過久的查詢。
SHOW FULL PROCESSLIST 顯示完整 SQL;KILL CONNECTION 中斷用戶端;KILL QUERY 只停查詢
SHOW FULL PROCESSLIST\G; KILL 12345;SHOW ENGINE INNODB STATUS\G詳細的 InnoDB 診斷資訊:鎖、交易、buffer pool、history。
PERFORMANCE_SCHEMA 查詢:SELECT * FROM performance_schema.events_statements_summary_by_digest_by_error;
SHOW ENGINE INNODB STATUS\G速查頁版本 1.0.0
適用於 MySQL 8.0+