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

加速 PHP 動態網站:MySQL 索引分析與優化實戰

     編輯:MySQL 資料庫相關知識

索引基本原理

B+ 樹結構,存儲「索引值 → 數據行指針」映射。無索引全表掃描,有索引直接定位。1000 行表索引查找比全掃快 100 倍+。

索引類型速查

類型建立方式特點
普通CREATE INDEX idx ON t(col)
ALTER TABLE t ADD INDEX idx(col)
CREATE TABLE t(..., INDEX idx(col))
無唯一限制
唯一CREATE UNIQUE INDEX ...
ALTER TABLE t ADD UNIQUE idx(col)
值唯一,寫入自查重
主鍵PRIMARY KEY (col)
ALTER TABLE t ADD PRIMARY KEY (col)
特殊唯一,非空,單表一個
全文FULLTEXT 於 VARCHAR/TEXT3.23.23+,大數據用 ALTER TABLE 建索引更快

單列 vs 多列索引實戰

CREATE TABLE people (
  peopleid SMALLINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  firstname CHAR(50), lastname CHAR(50), age SMALLINT, townid SMALLINT
);

查詢:WHERE firstname='Mike' AND lastname='Sullivan' AND age=17

  • 單列 INDEX(firstname):先縮小到 Mike,再掃描過濾 lastname/age,仍掃描大量中間行
  • 多列 INDEX(firstname, lastname, age):B+ 樹直接定位到唯一目標行,零掃描
  • 三個單列索引:優化器只能選一個最嚴格的,效果遠遜於多列索引

最左前綴原則

INDEX(firstname, lastname, age)
-- 可服務:
firstname, lastname, age
firstname, lastname
firstname
-- 不可服務:
lastname
age
lastname, age

選擇索引列決策

  1. WHERE 條件列:firstname、lastname
  2. JOIN 條件列:townid
  3. SELECT 輸出列:age、town.name 無需索引
  4. 比較操作符:<, <=, =, >=, BETWEEN, IN, LIKE('prefix%') 走索引;LIKE('%suffix') 不走

優化檢查清單

  • 核心查詢是否命中索引(EXPLAIN 驗證)
  • 復合索引列順序是否符合最左前綴
  • 是否有隱式類型轉換導致索引失效(字串列比數字)
  • 低基數列是否誤建索引
  • 慢查詢日誌 + EXPLAIN 定期巡檢
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved