首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 學習筆記核心知識點:字符類型差異、枚舉集合、正則匹配、BLOB/TEXT、權限、表操作、快取控制與 COUNT 優化思考

     編輯:MySQL 資料庫相關知識

整理 MySQL 核心知識點速查表,涵蓋字符類型選擇、ENUM/SET 差異、LIKE/REGEXP 匹配、BLOB/TEXT 特性、權限授予、表結構/數據拷貝、字段操作、查詢快取控制、COUNT 效能思考,適合開發者隨時翻閱鞏固。

1. CHAR vs VARCHAR

特性 CHAR(n) VARCHAR(n)
長度 固定 可變
存儲 右補空格至 n 字符 實際長度 + 1-2 字節長度前綴
速度 快(定長,易計算偏移) 稍慢
適用 長度固定/近似(MD5、UUID、手機號、郵編) 長度變化大(姓名、地址、描述)
截斷 超長報錯 超長截斷並警告

CHAR(5) 存 'bob' 實際存 'bob '(兩空格)。

2. ENUM vs SET

特性 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) 查詢

3. LIKE vs REGEXP

操作符 通配符 轉義 性能
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]';

4. TEXT vs BLOB

  • TEXT:不區分大小寫的 BLOB(字符類型,有字符集/校對規則)
  • BLOB:二進制數據(無字符集,按字節比較)
  • 兩者不能有 DEFAULT 值
  • 超過最大長度會被截斷
  • TEXT 類型:TINYTEXT (255), TEXT (64K), MEDIUMTEXT (16M), LONGTEXT (4G)
  • BLOB 類型:對應大小同上

5. 權限授予速查


-- 全域所有權限(超管)
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';

6. 表結構拷貝


-- 方法 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;

7. 表數據拷貝


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;

8. 字段操作


-- 表頭增加主鍵自增列
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 '';

9. 查詢快取控制


-- 清除快取
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 才快取

10. 思考題:COUNT 效能比較


-- 表:主鍵 id INT(10) NOT NULL AUTO_INCREMENT
-- 哪個更快?
SELECT COUNT(0) FROM table WHERE id > 0;
SELECT COUNT(0) FROM table;

分析:

  • MyISAM:表鎖統計行數,COUNT(*) 直接讀元數據極快;WHERE id>0 需掃描索引
  • InnoDB:無統計行數,COUNT(*) 需全表/索引掃描;WHERE id>0 同樣掃描主鍵索引
  • 結論:InnoDB 兩者接近(主鍵索引掃描);MyISAM 無 WHERE 更快。實際以 EXPLAIN 為準。

基礎知識點是解決複雜問題的基石。定期回顧、實測驗證、建立個人知識庫,比死記硬背更有效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved