1. 主鍵索引(PRIMARY KEY)
主鍵索引通常在創建表時定義,確保字段唯一且非空:
-- 建表時直接定義主鍵
CREATE TABLE users (id INT NOT NULL,name VARCHAR(50),PRIMARY KEY (id) -- 單字段主鍵
);-- 復合主鍵(多字段組合唯一)
CREATE TABLE order_details (order_id INT NOT NULL,product_id INT NOT NULL,quantity INT,PRIMARY KEY (order_id, product_id) -- 多字段組合主鍵
);
2. 唯一索引(UNIQUE)
確保字段值唯一(允許 NULL,但 NULL 只能出現一次):
-- 建表時創建唯一索引
CREATE TABLE users (id INT PRIMARY KEY,phone VARCHAR(11) NOT NULL,email VARCHAR(32) NOT NULL,UNIQUE INDEX idx_email (email) -- 為 email 字段創建唯一索引
);-- 表已存在時添加唯一索引
CREATE UNIQUE INDEX idx_phone ON users(phone); -- 為 phone 字段創建唯一索引
3. 普通索引(INDEX)
最基礎的索引,無唯一性約束,僅用于加速查詢:
-- 建表時創建普通索引
CREATE TABLE articles (id INT PRIMARY KEY,title VARCHAR(200),content TEXT,create_time DATETIME,INDEX idx_create_time (create_time) -- 為創建時間創建普通索引
);-- 表已存在時添加普通索引
CREATE INDEX idx_title ON articles(title); -- 為標題創建普通索引
4. 復合索引(多列索引)
基于多個字段組合創建,遵循 “最左前綴匹配原則”:
-- 為 user_id 和 status 組合創建復合索引
CREATE TABLE orders (id INT PRIMARY KEY,user_id INT,status TINYINT,create_time DATETIME,INDEX idx_user_status (user_id, status) -- 復合索引
);-- 表已存在時添加復合索引
CREATE INDEX idx_name_age ON users(name, age); -- 為 name 和 age 組合創建索引
復合索引的 “最左前綴匹配原則” 是指:當使用復合索引(多字段組合索引)時,數據庫會優先匹配索引中最左側的字段,只有當左側字段被有效使用時,索引才會被部分或完全啟用。
具體規則如下:
從左到右匹配
復合索引?(a, b, c)
?會優先匹配字段?a
,再匹配?a+b
,最后匹配?a+b+c
。
例如,對于索引?(name, age, gender)
:
- 能觸發索引的查詢條件:
WHERE name = ?
WHERE name = ? AND age = ?
WHERE name = ? AND age = ? AND gender = ?
- 無法觸發索引的查詢條件:
WHERE age = ?
(跳過了最左的?name
)WHERE age = ? AND gender = ?
(缺少最左的?name
)中間字段不連續時,僅匹配到連續的左側字段
對于索引?(a, b, c)
,如果查詢條件是?WHERE a = ? AND c = ?
,則只有?a
?字段會使用索引,c
?字段無法利用索引(因為跳過了?b
)。范圍查詢會中斷后續匹配
如果最左字段使用范圍查詢(>
,?<
,?BETWEEN
?等),則后續字段無法利用索引。
例如,對于索引?(name, age)
:
WHERE name = ? AND age > ?
:name
?全匹配,age
?范圍查詢,索引有效。WHERE name > ? AND age = ?
:name
?是范圍查詢,age
?無法利用索引。示例:
假設有復合索引?(user_id, order_time)
,以下查詢的索引使用情況:
SELECT * FROM orders WHERE user_id = 100
?→ 索引完全生效SELECT * FROM orders WHERE user_id = 100 AND order_time > '2023-01-01'
?→ 索引生效(user_id
?全匹配,order_time
?范圍匹配)SELECT * FROM orders WHERE order_time > '2023-01-01'
?→ 索引失效(跳過最左的?user_id
)總結:創建復合索引時,應將查詢頻率最高、區分度最高的字段放在左側,且查詢條件需從左到右使用索引字段,才能最大限度利用復合索引的性能優勢。
5. 全文索引(FULLTEXT)
用于大文本字段的全文檢索(僅支持 CHAR、VARCHAR、TEXT 類型):
-- 建表時創建全文索引
CREATE TABLE articles (id INT PRIMARY KEY,title VARCHAR(200),content TEXT,FULLTEXT INDEX idx_content (content) -- 為 content 字段創建全文索引
);-- 表已存在時添加全文索引
CREATE FULLTEXT INDEX idx_title_content ON articles(title, content); -- 多字段組合全文索引使用方式:查詢時需用 MATCH() AGAINST() 語法:SELECT * FROM articles
WHERE MATCH(title, content) AGAINST('數據庫 索引' IN BOOLEAN MODE);
6. 空間索引(SPATIAL)
針對空間數據類型(如 POINT、GEOMETRY 等)的索引:
-- 建表時創建空間索引(字段必須為 NOT NULL)
CREATE TABLE locations (id INT PRIMARY KEY,position POINT NOT NULL, -- 空間類型字段SPATIAL INDEX idx_position (position) -- 空間索引
);-- 表已存在時添加空間索引
CREATE SPATIAL INDEX idx_geo ON locations(position);
注意事項:
- 索引名(如?
idx_email
)建議遵循?idx_字段名
?格式,便于識別。- 復合索引的字段順序會影響查詢效率,應將查詢頻率高的字段放在前面。
- 過多索引會降低插入 / 更新 / 刪除的性能,需根據業務查詢頻率權衡。