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 注意事项
-
不要过度索引:每个索引都会增加写操作的开销
-
选择合适的前缀长度:对于长文本列
sql
CREATE INDEX idx_name ON table_name (column_name(10)); -- 前缀索引
-
考虑索引选择性:高选择性的列更适合建索引
-
定期维护索引:使用
ANALYZE TABLE更新索引统计信息
6.3 性能监控
sql
-- 检查索引使用情况 EXPLAIN SELECT * FROM users WHERE username = 'john';-- 查看未使用的索引(需要开启性能模式) SELECT * FROM sys.schema_unused_indexes;
通过合理使用索引,可以显著提高 MySQL 数据库的查询性能,但需要根据具体的查询模式和数据特征来设计和维护索引。
