首页 >文档 > mysql索引创建和删除

mysql索引创建和删除

MySQL索引创建和删除实战指南:掌握数据库性能优化核心技能!本文深入解析MySQL索引的创建方法(CREATE TABLE/ALTER TABLE/CREATE INDEX)和删除技巧(DROP INDEX/ALTER TABLE),详解主键索引、唯一索引、普通索引的区别与应用场景。了解索引最左前缀原则、区分度选择等优化策略,避免过度索引。适合Java程序员备战数据库面试,提升SQL查询性能。附2025年最新面试宝典资源,助你轻松应对索引相关高频考点!

MySQL索引创建和删除实战指南

大家好,作为经历过无数技术面试的程序员,今天和大家深入聊聊MySQL索引的创建和删除——面试高频考点,也是实际开发中的性能关键!

为什么索引这么重要? 想象一下你在图书馆找书。没有索引(目录),你得一排排书架翻找,这就是全表扫描!而索引就像图书目录,帮你快速定位。创建索引能大幅提升SELECT查询速度,但也会增加写操作(INSERT/UPDATE/DELETE)的开销和维护成本。

面试鸭返利网

📁 独家面试资源放送:2025年Java面试宝典 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g (覆盖数据库、并发、框架等核心考点,备战2025面试利器!)

如何创建MySQL索引?

创建索引主要有以下几种方式,面试时务必说清楚区别:

  1. 创建表时定义 (CREATE TABLE):

    CREATE TABLE users (
      id INT PRIMARY KEY, -- 主键索引自动创建
      username VARCHAR(50) UNIQUE, -- 唯一索引
      email VARCHAR(100),
      INDEX idx_email (email), -- 普通索引
      FULLTEXT INDEX idx_bio (bio) -- 全文索引
    );
    
    • 这是最直接的方式,在定义表结构时指定索引。
    • PRIMARY KEY 约束会自动创建主键索引(唯一且非空)。
    • UNIQUE 约束会自动创建唯一索引。
    • 使用 INDEXKEY 关键字创建普通索引。
    • 特定场景使用 FULLTEXT 创建全文索引。
  2. 使用ALTER TABLE语句:

    -- 添加普通索引
    ALTER TABLE users ADD INDEX idx_created_at (created_at);
    
    -- 添加唯一索引
    ALTER TABLE users ADD UNIQUE INDEX uk_phone (phone);
    
    -- 添加主键索引 (如果表没有主键)
    ALTER TABLE users ADD PRIMARY KEY (id);
    
    • 这种方式适合在表已存在的情况下添加索引。非常常用!
    • 语法清晰:ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT] INDEX 索引名 (列名1, [列名2, ...])
  3. 使用CREATE INDEX语句:

    -- 创建普通索引
    CREATE INDEX idx_name ON users (name);
    
    -- 创建唯一索引
    CREATE UNIQUE INDEX idx_employee_id ON employees (employee_id);
    
    • 这是MySQL中专用于创建索引的语句(不能用于主键)。
    • 语法:CREATE [UNIQUE | FULLTEXT] INDEX 索引名 ON 表名 (列名)
    • ALTER TABLE ... ADD INDEXCREATE INDEX 在功能上创建普通/唯一索引时基本等效,后者语义更明确。

创建索引的关键注意事项

  1. 选择合适的列: 高频出现在WHERE子句、ORDER BY子句、GROUP BY子句和JOIN条件的列是候选对象。
  2. 考虑索引长度: 对很长的列(如VARCHAR(255))可考虑前缀索引(INDEX idx_name (name(10)))。
  3. 联合索引威力大: 多个列一起创建索引(组合索引)时,列的顺序至关重要!遵循“最左前缀匹配原则”。
  4. 避免过度索引: 索引不是越多越好。每个索引都需要占用磁盘空间,并降低写速度。定期审视。
  5. 区分度高: 列的取值越多样化(如用户ID、手机号),索引效果通常越好。

如何删除MySQL索引?

当索引不再需要(如查询模式改变、索引建立不当)或为了重建时,就需要删除索引。删除操作本身通常很快。

  1. 使用ALTER TABLE语句:

    -- 删除普通索引或唯一索引
    ALTER TABLE users DROP INDEX idx_email;
    
    -- 删除主键索引 (需要先删除自增等依赖)
    ALTER TABLE users DROP PRIMARY KEY;
    
    • 这是最常用、最通用的删除索引方法。
    • 语法:ALTER TABLE 表名 DROP INDEX 索引名
    • 删除主键用 ALTER TABLE 表名 DROP PRIMARY KEY。注意:如果主键有自增属性或有其他约束依赖,删除会报错,需先处理。
  2. 使用DROP INDEX语句:

    -- 删除普通索引或唯一索引
    DROP INDEX idx_created_at ON users;
    
    • 语法:DROP INDEX 索引名 ON 表名
    • 注意:这个语句不能用于删除主键索引(PRIMARY KEY)。删除主键只能用ALTER TABLE ... DROP PRIMARY KEY
    • ALTER TABLE ... DROP INDEX 在删除非主键索引时效果相同。

删除索引的关键注意事项

  1. 确认必要性: 删除前务必确认该索引真的不再被重要查询使用。删除后,依赖它的查询性能会下降。
  2. 主键删除要谨慎: 删除主键索引影响很大(数据唯一性保证、关联关系)。如果表有自增主键,删除主键前通常需要先移除AUTO_INCREMENT属性(修改列定义)。
  3. 影响写入性能? 删除索引本身操作快,但删除后,之前被该索引优化的INSERT/UPDATE可能会变慢一点(因为写数据时需要维护的索引树少了一个)。主要考虑点还是对读性能的影响。
  4. 锁表问题: 在MySQL中,删除索引操作(尤其是大表)可能需要短暂的锁表(如写锁),可能会阻塞其他写操作。建议在低峰期操作。

什么时候该创建索引?什么时候该删除索引?

  • 创建索引时机:
    • 高频查询字段(WHERE条件)。
    • 需要排序(ORDER BY)或分组(GROUP BY)的字段。
    • 表关联(JOIN)时经常使用的字段。
    • 列值区分度高时。
  • 删除索引时机:
    • 索引建立后从未或极少被查询使用(可通过SHOW INDEX或性能监控工具观察)。
    • 索引建立不当(如建在区分度极低的字段上)。
    • 索引冗余(如已有联合索引(a,b),单独的索引(a)可能冗余)。
    • 需要重建索引(有时删除后重建能优化索引结构)。

面试常见问题回顾

面试官很可能这样问:

  • “MySQL创建索引有哪几种方式?有什么区别?”
  • “ALTER TABLE和CREATE INDEX在创建索引时有什么不同?”
  • “如何删除一个唯一索引?如何删除主键索引?有什么区别?”
  • “删除索引需要注意什么?”
  • “联合索引的最左前缀原则是什么?”
  • “什么情况下不适合建索引?”

理解创建索引删除索引的原理、方法、注意事项,是搞定数据库面试题的基础,更是优化生产环境性能的必备技能。索引用得好,查询速度快如闪电;用得不好,反而拖慢系统。

最后分享一个省💰小技巧: 如果你计划购买面试鸭的会员来刷题备战面试,可以先访问 面试鸭返利网 找到购买入口,这样能直接返利25元!用更低的成本获取优质的面试题库资源,性价比超高!(温馨提示:通过返利网购买才能享受返利哦)。

面试鸭返利网

希望这篇关于MySQL索引创建和删除的解析对大家有帮助!理解原理,多动手实践,面试和实战都不慌。

如果你想获取更多关于面试鸭的优惠信息,可以访问面试鸭返利网面试鸭优惠网,了解最新的优惠活动和返利政策。

🎯 立即加入面试鸭会员 →

支付宝扫码领取1-8元无门槛红包

支付宝红包二维码