MySQL 看似簡單,實則暗藏大量「知道能用,不知細節」的坑點。本文盤點 13 個高頻易忽視細節,助你避坑提效。
SELECT uid FROM users WHERE username = 'sunyue'; -- 字段名大小寫隨意 SELECT uid FROM users WHERE USERNAME = 'sunyue'; -- 等價 SELECT uid FROM users WHERE username = 'SUNYUE'; -- 數據大小寫敏感,查不到
建議:統一使用小寫下劃線命名(user_name),避免跨平台(Linux 區分表名大小寫)遷移驚魂。
_ 匹配單字符,% 匹配任意長度SELECT * FROM users WHERE username LIKE 'su_yue'; -- sunyue、suxyue 命中 SELECT * FROM users WHERE username LIKE 'su%yue'; -- sunyue、suxxxxxxxyue 命中 SELECT * FROM users WHERE username NOT LIKE 'su%'; -- 反向匹配
注意:% 開頭無法走索引,大表需用全文索引或 Elasticsearch。
MySQL 關鍵字多為英語單詞(JOIN、EXPLAIN、TRUNCATE),熟練英語可直接推導語法,減少查閱文檔時間。
REPLACE INTO:暴力覆蓋插入DELETE + INSERT,主鍵/唯一鍵衝突時刪除舊行再插新行。INSERT ... ON DUPLICATE KEY UPDATE:溫和 upsertINSERT INTO stats (date, pv) VALUES ('2024-01-15', 1)
ON DUPLICATE KEY UPDATE pv = pv + 1;
ON CONFLICT)。EXPLAIN:SQL 調優必備技能type(system/const/eq_ref/ref/range/index/ALL)、key(實際用到的索引)、rows(預估掃描行)、Extra(Using index/Using where/Using filesort/Using temporary)。| 引擎 | 單列索引最大長度 | 聯合索引總長度 |
|---|---|---|
| MyISAM | 1000 字節 | 1000 字節 |
| InnoDB | 767 字節 (innodb_large_prefix=OFF) | 3072 字節 |
| InnoDB (Large Prefix) | 3072 字節 | 3072 字節 |
utf8mb4 每字符 4 字節,VARCHAR(255) 即 1020 字節超過 767 限制。解決:開啟 innodb_large_prefix=ON + ROW_FORMAT=DYNAMIC/COMPRESSED,或縮短字段長度、使用前綴索引。
mysqldump --single-transaction --master-data=2(邏輯備份,跨版本遷移通用)。推薦:日常邏輯備份 + 定期物理備份雙軌制。
MySQL 不支持對現有非分區表直接 ALTER TABLE ... PARTITION(8.0 開始支持但有鎖表風險)。設計階段即確定分區鍵、分區數、維護策略。
# my.cnf slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = 1
配合 pt-query-digest 分析 TOP SQL,建立優化閉環。
ROW 格式:記錄行級變更,主從一致性最高,體積大。STATEMENT 格式:記錄 SQL,體積小但函數/觸發器易導致主從不一致。MIXED 格式:自動選擇(推薦)。sync_binlog=1、innodb_flush_log_at_trx_commit=1 保證雙 1 安全。| 工具 | 優勢 | 劣勢 | 推薦場景 |
|---|---|---|---|
| phpMyAdmin | Web 介面、無需安裝 | 大數據操作慢、權限管理弱 | 遠程輕量管理 |
| DataGrip / Navicat | 功能全、圖形化強、支持多數據源 | 收費、資源佔用大 | 日常開發 DBA |
| MySQL Shell / CLI | 極輕量、腳本自動化、管道組合 | 學習曲線陡 | 運維自動化、CI/CD |
細節決定成敗。將這 13 點內化為肌肉記憶,能讓你在 MySQL 開發運維中少走無數彎路:**命名規範、索引長度、慢查詢、Binlog、備份策略、工具鏈** 是長期收益最高的投資方向。