当前位置: 首页 > news >正文

MySQL如何加唯一索引

一、唯一索引的核心价值

唯一索引是MySQL中保证数据完整性的重要工具,它强制要求索引列的值必须唯一(允许NULL值,但多NULL值会被视为不同值)。与主键索引不同,唯一索引允许存在多个,且不隐含非空约束。典型应用场景包括:

  • 用户邮箱/手机号唯一验证
  • 订单号防重复
  • 商品SKU编码唯一性约束
二、建表时添加唯一索引

语法模板

CREATETABLEtable_name(column1 datatypeUNIQUE,-- 单列唯一索引column2 datatype,...,UNIQUE(col_a,col_b)-- 多列组合唯一索引);

实战示例

CREATETABLEusers(idINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(50)NOTNULLUNIQUE,-- 单列唯一索引emailVARCHAR(100)NOTNULL,phoneVARCHAR(20),INDEXidx_email_phone(email,phone)UNIQUE-- 组合唯一索引);

效果验证
插入重复用户名或(email+phone)组合时,MySQL将抛出ERROR 1062 (23000): Duplicate entry错误。

三、建表后添加唯一索引

方法1:ALTER TABLE(推荐)

ALTERTABLEproductsADDUNIQUEuk_product_sku(sku);-- 单列索引ALTERTABLEordersADDUNIQUEuk_order_user_time(user_id,order_time);-- 组合索引

方法2:CREATE INDEX

CREATEUNIQUEINDEXidx_unique_usernameONcustomers(username);
四、进阶操作与注意事项

1. 索引命名规范
建议使用前缀uk_(Unique Key)或uniq_开头,如uk_user_email,便于维护。

2. 处理冲突数据
添加唯一索引前,需先清理重复数据:

-- 查找重复数据SELECTcol,COUNT(*)FROMtable_nameGROUPBYcolHAVINGCOUNT(*)>1;-- 删除重复记录(保留最新)DELETEt1FROMtable_name t1INNERJOINtable_name t2WHEREt1.id>t2.idANDt1.col=t2.col;

3. 性能影响评估

  • 写操作性能下降(约10-30%)
  • 查询速度提升(尤其在WHERE/ORDER BY场景)
  • 索引占用存储空间(约表大小的1.2-1.5倍)

4. 特殊场景处理

  • 忽略重复插入:使用INSERT IGNORE
    INSERTIGNOREINTOusers(username)VALUES('john');
  • 条件唯一索引(MySQL 8.0+):
    CREATETABLElogs(idINT,event_dateDATE,UNIQUE(id,event_date)-- 仅当event_date在最近30天时生效)PARTITIONBYRANGECOLUMNS(event_date);
五、最佳实践建议
  1. 前缀索引优化:对长文本列使用前缀索引
    ALTERTABLEarticlesADDUNIQUE(title(50));-- 仅索引前50字符
  2. 避免过度索引:高频写入表建议不超过5个索引
  3. 监控索引碎片:定期执行OPTIMIZE TABLE重建索引
  4. 联合索引顺序:将区分度高的列放在组合索引左侧

完整示例SQL

-- 创建商品表并添加唯一索引CREATETABLEproducts(idINTAUTO_INCREMENTPRIMARYKEY,skuVARCHAR(20)NOTNULL,nameVARCHAR(100)NOTNULL,priceDECIMAL(10,2)NOTNULL,created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,CONSTRAINTuk_product_skuUNIQUE(sku)-- 命名约束)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;-- 添加组合唯一索引(订单号+用户ID)ALTERTABLEordersADDUNIQUEuk_order_user(order_number,user_id);

总结
MySQL唯一索引是保障数据一致性的重要防线。通过合理的索引设计,可以在保证数据质量的同时提升查询性能。实际操作中需平衡读写性能、存储空间和业务需求,定期使用EXPLAIN分析索引使用效率,持续优化索引策略。

http://www.jsqmd.com/news/326764/

相关文章:

  • 学长亲荐!MBA专属AI论文平台 —— 千笔·专业学术智能体
  • 不止于大,更强于冻:海信璀璨大冻梨冰箱如何改写家庭冷冻规则
  • 从 Redis 缓存设计谈起:如何避免缓存击穿、穿透与雪崩
  • Dell Precision Tower戴尔工作站BIOS如何设置才能解决无法从优盘启动的问题 - 尼古拉
  • mac-python解释器理解与python安装
  • 滁州市英语雅思培训机构推荐/2026权威测评出国雅思辅导机构口碑榜单
  • Python异步编程asyncio (一):Event Loop
  • 备考必看!阿虎主管药师预测卷准吗?2026备考预测卷全维度测评
  • 黄山市英语雅思培训机构推荐,2026权威测评出国雅思辅导机构口碑榜单
  • 滁州市英语雅思培训机构推荐:2026权威测评出国雅思辅导机构口碑榜单
  • 5aBswmK_ZD8
  • Java赋能AI:大模型接入实践与框架生态解析
  • 基于C#与ASP.NET MVC架构的图书借阅管理系统
  • 2026年,选中宁有机枸杞推荐哪个品牌?优选玺赞丨定义中国好枸杞
  • Java毕设选题推荐:基于springboot的员工绩效管理系统的设计与实现基于SpringBoot的公司员工绩效考核系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • JAVA安全基础-CC6链
  • 红魔6r救砖记录
  • 计算机Java毕设实战-基于SpringBoot和Vue的人力资源管理系统的设计与实现基于springboot的员工绩效管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 阿虎主管药师预测卷准吗?2026上岸考生亲测《阿虎白卷》实战经验
  • 安庆市英语雅思培训机构推荐、2026权威测评出国雅思辅导机构口碑榜单
  • 黄山市英语雅思培训机构推荐/2026权威测评出国雅思辅导机构口碑榜单
  • 2026靠谱的借贷平台推荐:安全合规平台选择指南
  • 滁州市英语雅思培训机构推荐、2026权威测评出国雅思辅导机构口碑榜单
  • 安庆市英语雅思培训机构推荐,2026权威测评出国雅思辅导机构口碑榜单
  • 淮北市英语雅思培训机构推荐、2026权威测评出国雅思辅导机构口碑榜单
  • 滁州市英语雅思培训机构推荐,2026权威测评出国雅思辅导机构口碑榜单
  • 2025年仓储货架大品牌权威推荐榜单,仓库货架承重标准/仓储货架描述/贯通式仓储货架定做/重型仓储货架货架价格仓储货架供应商哪家好
  • 【零基础学MySQL】第六章:DML 详解 - 指南
  • 黄山市英语雅思培训机构推荐、2026权威测评出国雅思辅导机构口碑榜单
  • 安庆市英语雅思培训机构推荐;2026权威测评出国雅思辅导机构口碑榜单