MySQL添加唯一索引的常見方法
一、唯一索引的核心價值
唯一索引是MySQL中保證數(shù)據(jù)完整性的重要工具,它強制要求索引列的值必須唯一(允許NULL值,但多NULL值會被視為不同值)。與主鍵索引不同,唯一索引允許存在多個,且不隱含非空約束。典型應(yīng)用場景包括:
- 用戶郵箱/手機號唯一驗證
- 訂單號防重復(fù)
- 商品SKU編碼唯一性約束
二、建表時添加唯一索引
語法模板
CREATE TABLE table_name (
column1 datatype UNIQUE, -- 單列唯一索引
column2 datatype,
...,
UNIQUE (col_a, col_b) -- 多列組合唯一索引
);
實戰(zhàn)示例
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE, -- 單列唯一索引
email VARCHAR(100) NOT NULL,
phone VARCHAR(20),
INDEX idx_email_phone (email, phone) UNIQUE -- 組合唯一索引
);
效果驗證
插入重復(fù)用戶名或(email+phone)組合時,MySQL將拋出ERROR 1062 (23000): Duplicate entry錯誤。
三、建表后添加唯一索引
方法1:ALTER TABLE(推薦)
ALTER TABLE products ADD UNIQUE uk_product_sku (sku); -- 單列索引 ALTER TABLE orders ADD UNIQUE uk_order_user_time (user_id, order_time); -- 組合索引
方法2:CREATE INDEX
CREATE UNIQUE INDEX idx_unique_username ON customers(username);
四、進階操作與注意事項
1. 索引命名規(guī)范
建議使用前綴uk_(Unique Key)或uniq_開頭,如uk_user_email,便于維護。
2. 處理沖突數(shù)據(jù)
添加唯一索引前,需先清理重復(fù)數(shù)據(jù):
-- 查找重復(fù)數(shù)據(jù) SELECT col, COUNT(*) FROM table_name GROUP BY col HAVING COUNT(*) > 1; -- 刪除重復(fù)記錄(保留最新) DELETE t1 FROM table_name t1 INNER JOIN table_name t2 WHERE t1.id > t2.id AND t1.col = t2.col;
3. 性能影響評估
- 寫操作性能下降(約10-30%)
- 查詢速度提升(尤其在WHERE/ORDER BY場景)
- 索引占用存儲空間(約表大小的1.2-1.5倍)
4. 特殊場景處理
- 忽略重復(fù)插入:使用
INSERT IGNORE
INSERT IGNORE INTO users (username) VALUES ('john');
- 條件唯一索引(MySQL 8.0+):
CREATE TABLE logs (
id INT,
event_date DATE,
UNIQUE (id, event_date) -- 僅當event_date在最近30天時生效
) PARTITION BY RANGE COLUMNS(event_date);
五、最佳實踐建議
- 前綴索引優(yōu)化:對長文本列使用前綴索引
ALTER TABLE articles ADD UNIQUE (title(50)); -- 僅索引前50字符
- 避免過度索引:高頻寫入表建議不超過5個索引
- 監(jiān)控索引碎片:定期執(zhí)行
OPTIMIZE TABLE重建索引 - 聯(lián)合索引順序:將區(qū)分度高的列放在組合索引左側(cè)
完整示例SQL
-- 創(chuàng)建商品表并添加唯一索引
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
sku VARCHAR(20) NOT NULL,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT uk_product_sku UNIQUE (sku) -- 命名約束
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 添加組合唯一索引(訂單號+用戶ID)
ALTER TABLE orders ADD UNIQUE uk_order_user (order_number, user_id);
總結(jié)
MySQL唯一索引是保障數(shù)據(jù)一致性的重要防線。通過合理的索引設(shè)計,可以在保證數(shù)據(jù)質(zhì)量的同時提升查詢性能。實際操作中需平衡讀寫性能、存儲空間和業(yè)務(wù)需求,定期使用EXPLAIN分析索引使用效率,持續(xù)優(yōu)化索引策略。
以上就是MySQL添加唯一索引的常見方法的詳細內(nèi)容,更多關(guān)于MySQL添加唯一索引的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
mysql使用from與join兩表查詢的區(qū)別總結(jié)
這篇文章主要給大家介紹了關(guān)于mysql使用from與join兩表查詢的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12
Mysql之DELETE操作對應(yīng)的undo日志方式
InnoDB通過正常記錄鏈表和垃圾鏈表管理數(shù)據(jù)頁,刪除記錄先標記為deletemark,后由purge線程移入垃圾鏈表回收空間,PAGE_FREE指向垃圾鏈表頭,PAGE_GARBAGE記錄可重用空間大小,Undo日志保存trx_id和roll_pointer,用于版本控制和回滾2025-08-08
MySQL數(shù)據(jù)庫運維之數(shù)據(jù)恢復(fù)的方法
本篇文章主要介紹了MySQL數(shù)據(jù)庫運維之數(shù)據(jù)恢復(fù)的方法,此處總結(jié)一下恢復(fù)方案,并結(jié)合數(shù)據(jù)庫的二進制日志做下數(shù)據(jù)恢復(fù)的示范。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06
一次Mysql使用IN大數(shù)據(jù)量的優(yōu)化記錄
這篇文章主要給大家介紹了關(guān)于Mysql使用IN大數(shù)據(jù)量的優(yōu)化的實戰(zhàn)記錄,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
MySQL事務(wù)保證數(shù)據(jù)一致性的核心講解
這篇文章主要介紹了MySQL事務(wù)實現(xiàn)保證數(shù)據(jù)一致性的原理,事務(wù)不是萬能藥,它不能解決所有數(shù)據(jù)問題,比如硬件物理損壞需要靠備份恢復(fù),但它是保障數(shù)據(jù)一致性的基礎(chǔ),沒有事務(wù),任何涉及多步操作的數(shù)據(jù)場景,都可能出現(xiàn)翻車風險,需要的朋友可以參考下2025-10-10

