1. 首页 > MySQL教程 > 正文

MySQL教程FG082-MySQL索引创建与管理

内容简介:本文主要介绍MySQL相关知识,包括安装、配置、优化等内容。风哥教程参考MySQL官方文档MySQL SQL Syntax、MySQL Server Administration。 01 更多视频教程www.fgedu.net.cn 02 学习交流加群风哥微信: itpux-com

Part01-基础概念与理论知识

索引是数据库中提高查询性能的重要结构,正确创建和管理索引对于优化数据库性能至关重要。本文将详细介绍MySQL中索引的创建、查看、修改和删除等操作,帮助开发者和DBA更好地管理数据库索引。 03 学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 使用CREATE INDEX语句

-- 创建普通索引
CREATE INDEX idx_employees_name ON employees(name);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_employees_email ON employees(email);

-- 创建复合索引
CREATE INDEX idx_employees_department_salary ON employees(department_id, salary);

-- 创建前缀索引
CREATE INDEX idx_employees_name_prefix ON employees(name(10));

-- 创建全文索引
CREATE FULLTEXT INDEX idx_articles_content ON articles(content);

-- 创建空间索引
CREATE SPATIAL INDEX idx_locations_coordinates ON locations(coordinates);

2.2 使用ALTER TABLE语句

-- 添加普通索引
ALTER TABLE employees ADD INDEX idx_employees_name(name);

-- 添加唯一索引
ALTER TABLE employees ADD UNIQUE INDEX idx_employees_email(email);

-- 添加复合索引
ALTER TABLE employees ADD INDEX idx_employees_department_salary(department_id, salary);

-- 添加全文索引
ALTER TABLE articles ADD FULLTEXT INDEX idx_articles_content(content);

-- 添加空间索引
ALTER TABLE locations ADD SPATIAL INDEX idx_locations_coordinates(coordinates);

2.3 在CREATE TABLE时创建索引

-- 在创建表时创建索引
CREATE TABLE employees (
    id INT PRIMARY KEY, -- 主键索引
    name VARCHAR(100),
    email VARCHAR(100) UNIQUE, -- 唯一索引
    department_id INT,
    salary DECIMAL(10,2),
    INDEX idx_employees_name(name), -- 普通索引
    INDEX idx_employees_department_salary(department_id, salary) -- 复合索引
);

-- 创建带全文索引的表
CREATE TABLE articles (
    id INT PRIMARY KEY,
    title VARCHAR(200),
    content TEXT,
    FULLTEXT INDEX idx_articles_content(content)
);

-- 创建带空间索引的表
CREATE TABLE locations (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    coordinates POINT,
    SPATIAL INDEX idx_locations_coordinates(coordinates)
);

Part03-生产环境项目实施方案

3.1 普通索引

-- 创建普通索引
CREATE INDEX idx_employees_name ON employees(name);

-- 或
ALTER TABLE employees ADD INDEX idx_employees_name(name);

3.2 唯一索引

-- 创建唯一索引
CREATE UNIQUE INDEX idx_employees_email ON employees(email);

-- 或
ALTER TABLE employees ADD UNIQUE INDEX idx_employees_email(email);

3.3 复合索引

-- 创建复合索引
CREATE INDEX idx_employees_department_salary ON employees(department_id, salary);

-- 或
ALTER TABLE employees ADD INDEX idx_employees_department_salary(department_id, salary);

3.4 全文索引

-- 创建全文索引
CREATE FULLTEXT INDEX idx_articles_content ON articles(content);

-- 或
ALTER TABLE articles ADD FULLTEXT INDEX idx_articles_content(content);

3.5 空间索引

-- 创建空间索引
CREATE SPATIAL INDEX idx_locations_coordinates ON locations(coordinates);

-- 或
ALTER TABLE locations ADD SPATIAL INDEX idx_locations_coordinates(coordinates);

3.6 前缀索引

-- 创建前缀索引
CREATE INDEX idx_employees_name_prefix ON employees(name(10));

-- 或
ALTER TABLE employees ADD INDEX idx_employees_name_prefix(name(10));

Part04-生产案例与实战讲解

4.1 使用SHOW INDEX语句

-- 查看表的所有索引
SHOW INDEX FROM employees;

-- 查看表的所有索引(更简洁的方式)
SHOW INDEXES FROM employees;

-- 查看表的所有索引(另一种方式)
SHOW KEYS FROM employees;

4.2 查询INFORMATION_SCHEMA.STATISTICS表

-- 查询表的索引信息
SELECT 
    table_name, 
    index_name, 
    column_name, 
    seq_in_index, 
    index_type 
FROM 
    information_schema.statistics 
WHERE 
    table_schema = 'your_database' 
    AND table_name = 'employees' 
ORDER BY 
    index_name, seq_in_index;

Part05-风哥经验总结与分享

5.1 重命名索引

-- 重命名索引(MySQL 5.7+)
ALTER TABLE employees RENAME INDEX idx_employees_name TO idx_emp_name;

5.2 修改索引类型

-- 修改索引类型需要先删除旧索引,再创建新索引
-- 删除旧索引
DROP INDEX idx_employees_name ON employees;
-- 创建新索引
CREATE INDEX idx_employees_name ON employees(name) USING BTREE;

6. 删除索引

6.1 使用DROP INDEX语句

-- 删除索引
DROP INDEX idx_employees_name ON employees;

-- 删除唯一索引
DROP INDEX idx_employees_email ON employees;

6.2 使用ALTER TABLE语句

-- 删除索引
ALTER TABLE employees DROP INDEX idx_employees_name;

-- 删除唯一索引
ALTER TABLE employees DROP INDEX idx_employees_email;

-- 删除主键索引(需要先删除自增属性)
ALTER TABLE employees MODIFY COLUMN id INT;
ALTER TABLE employees DROP PRIMARY KEY;

7. 索引管理最佳实践

7.1 定期检查索引

  • 定期查看表的索引状态
  • 检查索引是否被使用
  • 识别冗余索引

7.2 优化索引结构

  • 删除不使用的索引
  • 合并重复索引
  • 优化复合索引的顺序

7.3 监控索引使用情况

-- 启用性能模式
SET GLOBAL performance_schema = ON;

-- 查看索引使用情况
SELECT 
    object_schema, 
    object_name, 
    index_name, 
    count_star AS access_count 
FROM 
    performance_schema.table_io_waits_summary_by_index_usage 
WHERE 
    object_schema = 'your_database' 
    AND object_name = 'employees' 
ORDER BY 
    access_count DESC;

7.4 索引维护

  • 定期重建索引
  • 优化表结构
  • 监控索引碎片

8. 常见错误和解决方案

8.1 索引创建错误

错误信息 原因 解决方案
ERROR 1061 (42000): Duplicate key name ‘idx_employees_name’ 索引名重复 使用不同的索引名
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes 索引键长度超过限制 使用前缀索引或缩短列长度
ERROR 1214 (HY000): The used table type doesn’t support FULLTEXT indexes 存储引擎不支持全文索引 使用InnoDB或MyISAM存储引擎

8.2 索引删除错误

错误信息 原因 解决方案
ERROR 1091 (42000): Can’t DROP ‘idx_employees_name’; check that column/key exists 索引不存在 检查索引名是否正确
ERROR 1025 (HY000): Error on rename of ‘./test/#sql-1234’ to ‘./test/employees’ (errno: 150) 外键约束限制 先删除相关的外键约束

9. 示例演示

9.1 完整的索引管理示例

-- 创建测试表
CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100),
    email VARCHAR(100),
    department_id INT,
    salary DECIMAL(10,2),
    hire_date DATE
);

-- 插入测试数据
INSERT INTO employees (name, email, department_id, salary, hire_date) VALUES
('风哥1号', 'zhangsan@fgedu.net.cn', 1, 10000, '2023-01-15'),
('风哥2号', 'lisi@fgedu.net.cn', 1, 15000, '2022-06-10'),
('王五', 'wangwu@fgedu.net.cn', 2, 6000, '2023-03-20'),
('赵六', 'zhaoliu@fgedu.net.cn', 3, 9000, '2021-11-05'),
('孙七', 'sunqi@fgedu.net.cn', 1, 12000, '2022-09-01');

-- 创建索引
CREATE INDEX idx_employees_name ON employees(name);
CREATE UNIQUE INDEX idx_employees_email ON employees(email);
CREATE INDEX idx_employees_department_salary ON employees(department_id, salary);
CREATE INDEX idx_employees_hire_date ON employees(hire_date);

-- 查看索引
SHOW INDEX FROM employees;

-- 重命名索引
ALTER TABLE employees RENAME INDEX idx_employees_name TO idx_emp_name;

-- 查看修改后的索引
SHOW INDEX FROM employees;

-- 删除索引
DROP INDEX idx_emp_name ON employees;
ALTER TABLE employees DROP INDEX idx_employees_email;

-- 查看最终索引
SHOW INDEX FROM employees;

9.2 索引使用示例

-- 使用索引进行查询
EXPLAIN SELECT * FROM employees WHERE department_id = 1 AND salary > 10000;
EXPLAIN SELECT * FROM employees WHERE hire_date BETWEEN '2022-01-01' AND '2022-12-31';

-- 分析索引使用情况
SET GLOBAL performance_schema = ON;

-- 执行查询
SELECT * FROM employees WHERE department_id = 1 AND salary > 10000;
SELECT * FROM employees WHERE hire_date BETWEEN '2022-01-01' AND '2022-12-31';

-- 查看索引使用情况
SELECT 
    object_schema, 
    object_name, 
    index_name, 
    count_star AS access_count 
FROM 
    performance_schema.table_io_waits_summary_by_index_usage 
WHERE 
    object_schema = 'your_database' 
    AND object_name = 'employees' 
ORDER BY 
    access_count DESC;

10. 总结

索引的创建与管理是MySQL数据库性能优化的重要环节。本文详细介绍了MySQL中索引的创建、查看、修改和删除等操作,以及不同类型索引的创建方法和最佳实践。 04 风哥提示:

在实际应用中,应该根据具体的查询需求和数据特点来创建和管理索引。合理的索引设计可以显著提高数据库的查询性能,而过多或不合理的索引则会影响数据库的写入性能和存储空间。 05更多学习教程公众号风哥教程itpux_com

通过定期检查和优化索引结构,监控索引使用情况,以及遵循索引管理的最佳实践,可以确保数据库系统的高效运行,提升应用系统的响应速度和用户体验。 06 from mysql视频:www.itpux.com

GF-MySQL数据库培训文档系列

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息