MySQL中索引添加与删除的操作方法详解

 更新时间:2025年11月10日 10:24:20   作者:Java 码农  
MySQL索引是提高查询性能的关键,文章详细介绍了如何添加和删除索引,包括使用ALTER TABLE和CREATE INDEX语句,还讨论了索引类型、查看索引信息、最佳实践和注意事项,感兴趣的朋友跟随小编一起看看吧

在 MySQL 中,索引是提高查询性能的重要工具。以下是关于 MySQL 索引添加和删除的详细说明:

1. 添加索引

1.1 创建表时添加索引

-- 创建表时添加普通索引
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_username (username),  -- 普通索引
    UNIQUE INDEX idx_email (email)  -- 唯一索引
);
-- 创建表时添加复合索引
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    order_date DATE NOT NULL,
    amount DECIMAL(10,2),
    INDEX idx_user_date (user_id, order_date)  -- 复合索引
);

1.2 使用 ALTER TABLE 添加索引

-- 添加普通索引
ALTER TABLE users ADD INDEX idx_username (username);
-- 添加唯一索引
ALTER TABLE users ADD UNIQUE INDEX idx_email (email);
-- 添加主键索引(如果表没有主键)
ALTER TABLE users ADD PRIMARY KEY (id);
-- 添加复合索引
ALTER TABLE orders ADD INDEX idx_user_date (user_id, order_date);
-- 添加全文索引
ALTER TABLE articles ADD FULLTEXT INDEX idx_content (content);

1.3 使用 CREATE INDEX 语句

-- 创建普通索引
CREATE INDEX idx_username ON users (username);
-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON users (email);
-- 创建复合索引
CREATE INDEX idx_user_date ON orders (user_id, order_date);
-- 创建全文索引
CREATE FULLTEXT INDEX idx_content ON articles (content);

2. 删除索引

2.1 使用 ALTER TABLE 删除索引

-- 删除普通索引
ALTER TABLE users DROP INDEX idx_username;
-- 删除唯一索引
ALTER TABLE users DROP INDEX idx_email;
-- 删除主键索引
ALTER TABLE users DROP PRIMARY KEY;

2.2 使用 DROP INDEX 语句

-- 删除索引
DROP INDEX idx_username ON users;
-- 删除唯一索引
DROP INDEX idx_email ON users;

3. 查看索引信息

-- 查看表的索引信息
SHOW INDEX FROM users;
-- 查看创建表的语句(包含索引信息)
SHOW CREATE TABLE users;
-- 通过信息模式查看索引
SELECT 
    TABLE_NAME,
    INDEX_NAME,
    COLUMN_NAME,
    SEQ_IN_INDEX
FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'your_database_name'
AND TABLE_NAME = 'users';

4. 索引类型说明

4.1 不同类型的索引

-- 普通索引(最基本的索引,没有唯一性限制)
CREATE INDEX idx_name ON table_name (column_name);
-- 唯一索引(确保列值的唯一性)
CREATE UNIQUE INDEX idx_name ON table_name (column_name);
-- 主键索引(特殊的唯一索引,不允许NULL值)
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
-- 复合索引(多列组合的索引)
CREATE INDEX idx_name ON table_name (col1, col2, col3);
-- 全文索引(用于全文搜索)
CREATE FULLTEXT INDEX idx_name ON table_name (text_column);
-- 空间索引(用于地理数据)
CREATE SPATIAL INDEX idx_name ON table_name (spatial_column);

5. 实际示例

-- 创建示例表
CREATE TABLE employees (
    id INT AUTO_INCREMENT,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    email VARCHAR(100),
    department_id INT,
    hire_date DATE,
    salary DECIMAL(10,2),
    PRIMARY KEY (id)
);
-- 添加各种索引
-- 单列索引
ALTER TABLE employees ADD INDEX idx_last_name (last_name);
-- 唯一索引
ALTER TABLE employees ADD UNIQUE INDEX idx_email (email);
-- 复合索引
ALTER TABLE employees ADD INDEX idx_dept_hire (department_id, hire_date);
-- 查看索引
SHOW INDEX FROM employees;
-- 删除索引
ALTER TABLE employees DROP INDEX idx_last_name;
DROP INDEX idx_email ON employees;

6. 最佳实践和注意事项

6.1 索引设计建议

-- 为经常查询的列创建索引
CREATE INDEX idx_frequently_queried ON table_name (frequently_queried_column);
-- 为外键列创建索引
CREATE INDEX idx_foreign_key ON child_table (parent_id);
-- 为WHERE子句中的列创建索引
CREATE INDEX idx_where_condition ON table_name (column_used_in_where);
-- 为ORDER BY和GROUP BY的列创建索引
CREATE INDEX idx_order_group ON table_name (column_used_for_ordering);

6.2 注意事项

  • 不要过度索引:每个索引都会增加写操作的开销
  • 选择合适的前缀长度:对于长文本列
CREATE INDEX idx_name ON table_name (column_name(10)); -- 前缀索引
  • 考虑索引选择性:高选择性的列更适合建索引
  • 定期维护索引:使用 ANALYZE TABLE 更新索引统计信息

6.3 性能监控

-- 检查索引使用情况
EXPLAIN SELECT * FROM users WHERE username = 'john';
-- 查看未使用的索引(需要开启性能模式)
SELECT * FROM sys.schema_unused_indexes;

通过合理使用索引,可以显著提高 MySQL 数据库的查询性能,但需要根据具体的查询模式和数据特征来设计和维护索引。

到此这篇关于MySQL中索引添加与删除的操作方法详解的文章就介绍到这了,更多相关mysql索引添加与删除内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL保证数据不丢失的方案详解

    MySQL保证数据不丢失的方案详解

    MySQL作为一个存储数据的产品,怎么确保数据的持久性和不丢失才是最重要的,感兴趣的可以跟随本文一探究竟,文中通过图文结合给大家讲解的非常详细,需要的朋友快来跟着小编一起来学习吧
    2023-12-12
  • 使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值

    使用MySQL的LAST_INSERT_ID来确定各分表的唯一ID值

    MySQL数据表结构中,一般情况下,都会定义一个具有‘AUTO_INCREMENT’扩展属性的‘ID’字段,以确保数据表的每一条记录都可以用这个ID唯一确定
    2011-08-08
  • mysql慢查询mysqldumpslow的使用详解

    mysql慢查询mysqldumpslow的使用详解

    这篇文章主要介绍了mysql慢查询mysqldumpslow的使用详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-06-06
  • MySQL性能优化之慢查询的排查与解决方案

    MySQL性能优化之慢查询的排查与解决方案

    MySQL作为一种广泛使用的数据库,其性能优化是每个开发人员和运维人员都必须了解和掌握的技能之一,本文将详细介绍MySQL慢查询的排查过程,并结合实际案例进行分析,希望对大家有所帮助
    2025-08-08
  • mysql oracle和sqlserver分页查询实例解析

    mysql oracle和sqlserver分页查询实例解析

    最近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴到脚本之家平台供大家参考
    2017-10-10
  • MySQL中按时间获取慢日志信息的方法

    MySQL中按时间获取慢日志信息的方法

    这篇文章主要介绍了MySQL中按时间获取慢日志信息的方法,使用到了cutlogbytime这个工具,主要操作是设置时间戳,需要的朋友可以参考下
    2015-05-05
  • Win下Mysql5.6升级到5.7的方法

    Win下Mysql5.6升级到5.7的方法

    MySQL的升级方式分为两种:原地升级和逻辑升级。这两种升级方式,本质没有什么区别的,下面通过本文给大家详细介绍Win下Mysql5.6升级到5.7的方法,需要的的朋友参考下
    2017-04-04
  • MySQL在Centos7环境安装的完整步骤记录

    MySQL在Centos7环境安装的完整步骤记录

    在CentOS7环境下安装MySQL是一项常见的任务,尤其对于那些没有网络连接或者需要在隔离环境中的开发者来说,离线安装MySQL显得尤为重要,这篇文章主要介绍了MySQL在Centos7环境安装的完整步骤,需要的朋友可以参考下
    2024-10-10
  • MySQL中实施排序(sorting)及分组(grouping)常用操作方法

    MySQL中实施排序(sorting)及分组(grouping)常用操作方法

    在MySQL中实施排序与分组是数据查询中的常用操作,用以对结果集进行组织和概括,本文给大家介绍MySQL中实施排序(sorting)及分组(grouping)常用操作方法,感兴趣的朋友一起看看吧
    2025-09-09
  • Mysql基础之常见函数

    Mysql基础之常见函数

    这篇文章主要介绍了Mysql基础之常见函数,文中有非常详细的代码示例,对正在学习数据库的小伙伴们有很大的帮助,需要的朋友可以参考下
    2021-04-04

最新评论