1. MySQL索引创建全攻略
作为一名数据库工程师,我经常遇到开发团队对MySQL索引创建方式了解不够全面的情况。实际上,MySQL提供了多种灵活的索引创建方法,每种都有其适用场景和注意事项。
1.1 建表时创建索引(推荐做法)
在表设计阶段就规划好索引是最佳实践。我们来看一个完整的用户表示例:
sql复制CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键索引
email VARCHAR(100) UNIQUE, -- 唯一索引
phone VARCHAR(20),
name VARCHAR(50),
age INT,
status TINYINT DEFAULT 1,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
-- 普通索引(表级别定义)
INDEX idx_phone (phone),
-- 组合索引(最常用)
INDEX idx_name_age (name, age),
-- 唯一组合索引
UNIQUE INDEX uk_email_status (email, status),
-- 前缀索引(邮箱前8位)
INDEX idx_email_prefix (email(8)),
-- 函数索引(MySQL 8.0.13+)
INDEX idx_func ((LOWER(name))), -- 忽略大小写查询
-- 降序索引(MySQL 8.0+,优化DESC排序)
INDEX idx_time_desc (create_time DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键点解析:
- 主键和唯一索引可以直接在列定义时声明,语法简洁
- 普通索引建议使用表级定义,便于统一管理
- 组合索引字段顺序很重要,遵循"最左前缀"原则
- 前缀索引适合长字符串字段,可节省空间
- 函数索引是MySQL 8.0的新特性,能优化特定查询
提示:创建表后建议执行
SHOW CREATE TABLE user\G确认索引是否按预期创建。
1.2 后期添加索引(ALTER TABLE方式)
对于已存在的表,我们可以使用ALTER TABLE添加索引:
sql复制-- 添加主键(如果建表时没指定)
ALTER TABLE user ADD PRIMARY KEY (id);
-- 添加唯一索引
ALTER TABLE user ADD UNIQUE INDEX uk_phone (phone);
-- 添加普通索引
ALTER TABLE user ADD INDEX idx_status (status);
-- 添加组合索引
ALTER TABLE user ADD INDEX idx_age_status (age, status);
-- 添加全文索引(MyISAM和InnoDB 5.6+支持)
ALTER TABLE article ADD FULLTEXT INDEX ft_content (content);
-- 添加空间索引(GIS数据)
ALTER TABLE map_location ADD SPATIAL INDEX sp_geo (geo_point);
-- 指定索引算法(MySQL 8.0默认InnoDB用B-tree)
ALTER TABLE user ADD INDEX idx_algo (name) USING BTREE;
注意事项:
- 大表添加索引可能锁表,影响线上业务
- 全文索引和空间索引有特殊
