整理 MySQL 核心知識點速查表,涵蓋字符類型選擇、ENUM/SET 差異、LIKE/REGEXP 匹配、BLOB/TEXT 特性、權限授予、表結構/數據拷貝、字段操作、查詢快取控制、COUNT 效能思考,適合開發者隨時翻閱鞏固。
| 特性 | CHAR(n) | VARCHAR(n) |
|---|---|---|
| 長度 | 固定 | 可變 |
| 存儲 | 右補空格至 n 字符 | 實際長度 + 1-2 字節長度前綴 |
| 速度 | 快(定長,易計算偏移) | 稍慢 |
| 適用 | 長度固定/近似(MD5、UUID、手機號、郵編) | 長度變化大(姓名、地址、描述) |
| 截斷 | 超長報錯 | 超長截斷並警告 |
CHAR(5) 存 'bob' 實際存 'bob '(兩空格)。
| 特性 | ENUM | SET |
|---|---|---|
| 值數量 | 單一值(從定義列表選一) | 多值組合(從定義列表選零個或多個) |
| 存儲 | 1-2 字節(索引值) | 1-8 字節(位圖) |
| 定義上限 | 65,535 個元素 | 64 個元素 |
| 適用 | 狀態、性別、類型等互斥枚舉 | 標籤、權限掩碼等組合枚舉 |
ALTER TABLE books ADD COLUMN transport SET ('hk','sh') NOT NULL AFTER count;
UPDATE books SET transport = 'hk,sh' WHERE id = 1;
-- 存儲為 'hk,sh',可用 FIND_IN_SET('hk', transport) 查詢
| 操作符 | 通配符 | 轉義 | 性能 |
|---|---|---|---|
| LIKE | % (任意長度), _ (單字符) |
\%, \_ |
可用索引(前綴匹配) |
| REGEXP | 正則表達式 | 標準正則轉義 | 通常全表掃描,無法用索引 |
-- 以 s 結尾
SELECT * FROM books WHERE name REGEXP 's$';
-- 以 w 或 h 開頭
SELECT * FROM books WHERE name REGEXP '^[wh]';
-- 精確 5 字符
SELECT * FROM books WHERE name REGEXP '^.{5}$';
-- 包含 window 後跟 s
SELECT * FROM books WHERE name REGEXP 'window[s]';
TEXT:不區分大小寫的 BLOB(字符類型,有字符集/校對規則)BLOB:二進制數據(無字符集,按字節比較)TEXT 類型:TINYTEXT (255), TEXT (64K), MEDIUMTEXT (16M), LONGTEXT (4G)BLOB 類型:對應大小同上
-- 全域所有權限(超管)
GRANT ALL ON *.* TO root@'10.10.11.91' IDENTIFIED BY 'root' WITH GRANT OPTION;
-- 特定庫讀寫
GRANT SELECT, INSERT, UPDATE, DELETE ON db.* TO 'user'@'%' IDENTIFIED BY 'pass';
-- 方法 1:WHERE 1<>1 保證無數據
CREATE TABLE to_table AS SELECT * FROM from_table WHERE 1<>1;
-- 方法 2:指定欄位
CREATE TABLE to_table (id, name, num) AS SELECT id, name, num FROM from_table WHERE 1<>1;
INSERT INTO to_table SELECT * FROM from_table WHERE 1;
INSERT INTO to_table (id, name, num) SELECT id, name, num FROM from_table WHERE 1;
-- 表頭增加主鍵自增列
ALTER TABLE table_name ADD COLUMN id INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST;
-- 表尾增加列
ALTER TABLE table_name ADD COLUMN new_col VARCHAR(50) DEFAULT '';
-- 清除快取
RESET QUERY CACHE;
-- 或
FLUSH TABLES table_name;
-- 強制不使用快取
SELECT SQL_NO_CACHE COUNT(*) FROM table;
-- 強制使用快取(需 query_cache_type=2)
SELECT SQL_CACHE COUNT(*) FROM table_name;
-- my.cnf 設置按需快取
query_cache_type = 2 -- 只有 SQL_CACHE 才快取
-- 表:主鍵 id INT(10) NOT NULL AUTO_INCREMENT
-- 哪個更快?
SELECT COUNT(0) FROM table WHERE id > 0;
SELECT COUNT(0) FROM table;
分析:
COUNT(*) 直接讀元數據極快;WHERE id>0 需掃描索引COUNT(*) 需全表/索引掃描;WHERE id>0 同樣掃描主鍵索引EXPLAIN 為準。基礎知識點是解決複雜問題的基石。定期回顧、實測驗證、建立個人知識庫,比死記硬背更有效。