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

MySQL 5.0 官方手冊深度解讀:資料庫結構優化 (第六篇)

     編輯:MySQL 資料庫相關知識

核心設計哲學:MySQL 的獨特儲存架構

MySQL 將資料 (Data)與索引 (Index)分離儲存於不同檔案,這與 Oracle、Sybase 等多數資料庫「索引葉節點直接包含資料」的聚集索引架構截然不同。手冊強調此設計對現代系統更合適,主要優勢在於:

  • 掃描表不需讀取索引,全表掃描更快
  • 可單獨快取索引,記憶體利用率高
  • 支援多種儲存引擎 (MyISAM, InnoDB, MEMORY 等) 共存

反面:根據索引查找資料需額外一次磁碟 I/O (先讀索引再讀資料),但此成本可透過快取大幅降低。

讓資料更小巧:優化的第一原則

「盡可能減少磁碟佔用」 是效能調校的基石。較小的表意味著:

  1. 磁碟讀取更少 (I/O 降低)
  2. 記憶體快取命中率更高
  3. 索引體積更小,維護成本更低

具體縮減策略

策略說明效益
選用最小足夠型別MEDIUMINT 替代 INT、SMALLINT 替代 MEDIUMINT儲存減少 25-50%
盡量 NOT NULL每欄省 1 bit,查詢優化器可簡化判斷邏輯速度提升、空間節省
固定長度格式 (MyISAM)無 VARCHAR/TEXT/BLOB 時自動啟用讀取速度快 (代價:空間略增)
主鍵越短越好主鍵值會重複儲存於所有二級索引所有索引體積縮減
只建必要索引索引加速讀、拖慢寫寫入效能提升
前綴索引INDEX(name(10)) 僅索引前 10 字元索引檔案大幅縮小
拆分高頻掃描表熱資料小表 + 冷資料大表掃描熱資料極快

欄位索引:全型別支援與前綴技巧

  • 所有 MySQL 型別皆可建索引
  • 每表至少支援 16 個索引,總長度 ≥ 256 bytes (視引擎而定)
  • 前綴索引語法:col_name(length) 僅索引前綴,大幅縮減索引體積
  • BLOB/TEXT 索引:MyISAM、InnoDB (4.0.14+) 支援,必須指定前綴長度 (255 bytes 內,4.1.2+ 擴展至 1000 bytes)。注意:長度單位為位元組,多位元組字符集 (utf8mb4) 需換算字元數
  • 全文索引:3.23.23+ 支援,僅 MyISAM,針對 CHAR/VARCHAR/TEXT,不支援前綴,整欄檢索
  • 空間索引:4.1.0+,僅 MyISAM,R-tree 結構,支援 GIS 型別
  • MEMORY 引擎:預設 Hash 索引 (精確查找極快),4.1.0+ 可選 B-tree (範圍查詢)

多欄索引 (複合索引):左前綴原理與實戰

定義與結構

  • 最多 15 個欄位組成
  • 可視為「欄位值連接後排序的陣列」
  • 支援前綴索引:INDEX idx_name (last_name(10), first_name(5))

左前綴匹配規則 (核心!)

複合索引 INDEX name (last_name, first_name) 可服務:

查詢條件是否用到索引說明
WHERE last_name='Widenius'✅ 是左前綴第 1 欄
WHERE last_name='W' AND first_name='M'✅ 是左前綴第 1+2 欄
WHERE last_name='W' AND (first_name='M' OR first_name='N')✅ 是左前綴 + IN/OR
WHERE last_name='W' AND first_name >= 'M' AND first_name < 'N'✅ 是左前綴 + 範圍
WHERE first_name='Michael'❌ 否非左前綴 (跳過第 1 欄)
WHERE last_name='W' OR first_name='M'❌ 否OR 打破左前綴連續性

優化建議

  1. 將高選擇性 (基數大) 欄位放左邊,讓索引過濾力最強
  2. 避免在複合索引中使用範圍條件後的欄位:WHERE a=1 AND b>2 AND c=3 中 c 無法利用索引
  3. 覆蓋索引:查詢只需索引欄位即可滿足 (SELECT a,b FROM t WHERE a=1),避免回表,極大提升效能

儲存引擎選擇指引

引擎索引/資料分離鎖粒度事務適用場景
MyISAM是表鎖否讀多寫少、全文搜尋、唯讀分析
InnoDB否 (聚集索引)行鎖是OLTP、高併發寫入、需 ACID
MEMORY記憶體內表鎖否暫存表、快取、極速查找
BDB否頁鎖是舊版替代方案,已棄用

手冊建議:根據應用存取模式選擇引擎,同一資料庫可混用多引擎。

總結:結構優化的黃金法則

  1. 垂直拆分:大欄位 (TEXT/BLOB) 移至獨立表,主表保持窄而快
  2. 水平分區:巨大表按時間/ID 範圍分表或使用 Partitioning
  3. 型別收緊:每個欄位用最小足夠型別,NOT NULL 為預設
  4. 索引精準:複合索引遵循左前綴、善用覆蓋索引、定期 ANALYZE TABLE 更新統計
  5. 引擎匹配:寫入密集用 InnoDB、讀取密集用 MyISAM、暫存用 MEMORY

資料庫結構優化是一次性投入、長期受益的高報酬工作,值得在設計階段深思熟慮。

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