MySQL 擁有許多鮮為人知但極度實用的特性,掌握這些技巧能大幅提升開發與運維效率。
mysql --xml -e "SELECT * FROM test.stories;"
輸出標準 XML,便於程式解析整合:
1
This is a test
修改全文搜尋參數後,無需 ALTER TABLE ... DROP INDEX ... ADD INDEX 重建,直接:
REPAIR TABLE content QUICK;
-- +-----------+--------+----------+----------+
-- | Table | Op | Msg_type | Msg_text |
-- +-----------+--------+----------+----------+
-- | content | repair | status | OK |
-- +-----------+--------+----------+----------+
秒級完成,適合大表維護。
myisampack movies.MYI
-- Compressing movies.MYD: (146 records) - 41.05%
壓縮後唯讀、極大幅節省磁碟空間,適合歸檔資料、日誌表。
SELECT IF(priv=1, 'admin', 'guest') AS usertype FROM privs WHERE username='joe';
-- +----------+
-- | usertype |
-- +----------+
-- | admin |
-- +----------+
SELECT CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 80 THEN 'B'
ELSE 'C'
END AS grade FROM scores;
mysqldump -T /tmp/export_dir --fields-terminated-by=',' db_name table_name
產生 table_name.txt(資料)與 table_name.sql(結構),直接可被 Excel、Python pandas 讀取。
| 技巧 | 指令/語法 | 用途 |
|---|---|---|
| 查看表大小 | SHOW TABLE STATUS LIKE 'tbl_name'\G | 快速掌握資料量、索引大小、碎片率 |
| 只查結構不查資料 | SHOW CREATE TABLE tbl_name | 取得建表 DDL,含索引、外鍵、字元集 |
| 查詢執行計劃 | EXPLAIN SELECT ... | 分析索引使用、掃描行數、Join 類型 |
| 強制/忽略索引 | SELECT * FROM t USE INDEX (idx_a) ...SELECT * FROM t IGNORE INDEX (idx_b) ... | 優化器選錯索引時手動干預 |
| 直線 Join 順序 | SELECT STRAIGHT_JOIN ... | 強制按 FROM 子句順序 Join,避免優化器誤判 |
| 多行插入優化 | INSERT INTO t VALUES (1),(2),(3)... | 單條 SQL 批次寫入,減少網路往返 |
| 插入或更新 | INSERT ... ON DUPLICATE KEY UPDATE ... | Upsert 模式,避免先查後寫競態 |
| 分頁優化 | WHERE id > last_id ORDER BY id LIMIT 20 | 避免 OFFSET 深分頁掃描大量資料 |