首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 索引體系深度解析:KEY、PRIMARY KEY、UNIQUE KEY 與 INDEX 的本質差異

     編輯:MySQL 綜合教學

核心結論先行

概念層級作用關鍵特性
PRIMARY KEY邏輯/模型實體完整性、唯一標識非空、唯一、一表僅一個、自動建唯一索引
UNIQUE KEY邏輯/模型業務唯一性約束允許 NULL(多 NULL 視為不重複)、可多個
KEY / INDEX物理/實現查詢加速KEY 是 INDEX 同義詞;含普通、全文、空間等類型
FOREIGN KEY邏輯/模型引用完整性需父表有索引,InnoDB 自動建索引

一、KEY vs PRIMARY KEY

CREATE TABLE wh_logrecord (
    logrecord_id INT AUTO_INCREMENT,
    user_name VARCHAR(100),
    PRIMARY KEY (logrecord_id),
    KEY wh_logrecord_user_name (user_name)  -- 這裡的 KEY = 普通索引
);
  • PRIMARY KEY:主鍵約束,邏輯層面。
  • KEY idx_name (col):普通索引,物理層面加速查詢。不等於外鍵。
  • 外鍵語法:FOREIGN KEY (col) REFERENCES parent(col)。

二、KEY vs INDEX

KEY 是邏輯概念,INDEX 是物理實現。

  • MySQL 文檔:「KEY 通常是 INDEX 同義詞」。
  • PRIMARY KEY 在列定義中可簡寫為 KEY,為兼容其他資料庫。
  • 建表時寫 KEY idx (a,b) 實際創建的是 聯合索引。
  • 最左前綴原則:KEY (a,b,c) 支援 a、a,b、a,b,c 查詢;b、c、b,c 不走索引。

三、UNIQUE KEY vs PRIMARY KEY

差異點PRIMARY KEYUNIQUE KEY
空值不允許 NULL(隱式 NOT NULL)允許 NULL,多 NULL 不視為重複
數量一張表只能有一個可建多個
全 NULL 唯一性不適用全 NULL 可重複(索引不存全 NULL)
-- 示範 UNIQUE 允許多 NULL
ALTER TABLE t ADD CONSTRAINT uk_t_1 UNIQUE (a,b);
INSERT INTO t(a,b) VALUES (NULL,1);  -- 不可重複
INSERT INTO t(a,b) VALUES (NULL,NULL); -- 可重複

四、UNIQUE KEY 實戰用法

建表時

CREATE TABLE Persons (
    Id_P INT NOT NULL,
    LastName VARCHAR(255) NOT NULL,
    CONSTRAINT uc_PersonID UNIQUE (Id_P, LastName)
);

事後添加/刪除

ALTER TABLE Persons ADD UNIQUE (Id_P);
ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P, LastName);
ALTER TABLE Persons DROP INDEX uc_PersonID;  -- MySQL 用 DROP INDEX 刪除 UNIQUE

五、設計建議

  1. 業務主鍵用 BIGINT AUTO_INCREMENT,無業務含義。
  2. 業務唯一性(手機、身份證、訂單號)用 UNIQUE KEY。
  3. 查詢加速用普通 INDEX(或 KEY)。
  4. 外鍵慎用,高併發下鎖開銷大,應用層維護引用完整性更靈活。
  5. 主鍵自動建唯一索引,勿重複建索引。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved