MySQL索引添加与删除方法详解

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

1. 添加索引

1.1 创建表时添加索引

sql

复制代码
-- 创建表时添加普通索引
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 添加索引

sql

复制代码
-- 添加普通索引
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 语句

sql

复制代码
-- 创建普通索引
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 删除索引

sql

复制代码
-- 删除普通索引
ALTER TABLE users DROP INDEX idx_username;

-- 删除唯一索引
ALTER TABLE users DROP INDEX idx_email;

-- 删除主键索引
ALTER TABLE users DROP PRIMARY KEY;

2.2 使用 DROP INDEX 语句

sql

复制代码
-- 删除索引
DROP INDEX idx_username ON users;

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

3. 查看索引信息

sql

复制代码
-- 查看表的索引信息
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 不同类型的索引

sql

复制代码
-- 普通索引(最基本的索引,没有唯一性限制)
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. 实际示例

sql

复制代码
-- 创建示例表
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 索引设计建议

sql

复制代码
-- 为经常查询的列创建索引
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 注意事项

  1. 不要过度索引:每个索引都会增加写操作的开销

  2. 选择合适的前缀长度:对于长文本列

sql

复制代码
CREATE INDEX idx_name ON table_name (column_name(10)); -- 前缀索引
  1. 考虑索引选择性:高选择性的列更适合建索引

  2. 定期维护索引 :使用 ANALYZE TABLE 更新索引统计信息

6.3 性能监控

sql

复制代码
-- 检查索引使用情况
EXPLAIN SELECT * FROM users WHERE username = 'john';

-- 查看未使用的索引(需要开启性能模式)
SELECT * FROM sys.schema_unused_indexes;

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

相关推荐
正在走向自律2 小时前
电科金仓KingbaseES数据库全面语法解析与应用实践
数据库·国产数据库·kingbasees·数据定义语言ddl·数据操作语言dml·kingbasees语法
web安全工具库2 小时前
Linux进程的:深入理解子进程回收与僵尸进程
java·linux·数据库
麦聪聊数据2 小时前
大数据与云原生数据库中的 SQL2API:优化跨平台数据访问与查询
数据库·sql·云原生
虚伪的空想家2 小时前
记录次etcd故障,fatal error: bus error
服务器·数据库·k8s·etcd
韩立学长2 小时前
【开题答辩实录分享】以《植物爱好者交流平台的设计与实现》为例进行答辩实录分享
spring boot·后端·mysql
笨手笨脚の3 小时前
Mysql 的锁机制
数据库·mysql··死锁·间隙锁
老友@3 小时前
一次由 PageHelper 分页污染引发的 Bug 排查实录
java·数据库·bug·mybatis·pagehelper·分页污染
hzk的学习笔记3 小时前
Redisson解锁失败,watchdog会不会一直续期下去?
数据库·redis·缓存
合作小小程序员小小店3 小时前
web网页开发,在线%商城,电商,商品购买%系统demo,基于vscode,apache,html,css,jquery,php,mysql数据库
开发语言·前端·数据库·mysql·html·php·电商