mysql索引的用法
十分想念顺店杂可。。。
MySQL 索引是提高查询效率的关键工具,类似于书籍的目录,能快速定位数据位置。以下是其常用使用方法,包含创建、类型、使用场景及注意事项:
一、索引的基本类型及创建方法
MySQL 支持多种索引类型,需根据业务场景选择:
1. 主键索引(PRIMARY KEY)
- 特点:唯一标识表中记录,自动创建,一个表只能有一个主键,值不能为空(NOT NULL)。
- 创建方式:
-- 建表时指定 CREATE TABLE user (id INT PRIMARY KEY, -- 主键索引name VARCHAR(50) );-- 已有表添加 ALTER TABLE user ADD PRIMARY KEY (id);
2. 唯一索引(UNIQUE)
- 特点:确保列值唯一(允许 NULL,但 NULL 只出现一次),可用于防止重复数据。
- 创建方式:
-- 建表时指定 CREATE TABLE user (id INT,phone VARCHAR(20) UNIQUE, -- 唯一索引PRIMARY KEY (id) );-- 已有表添加 CREATE UNIQUE INDEX idx_phone ON user(phone); -- 或 ALTER TABLE user ADD UNIQUE idx_phone (phone);
3. 普通索引(INDEX)
- 特点:最基础的索引,无唯一性限制,用于加速查询。
- 创建方式:
-- 建表时指定 CREATE TABLE user (id INT PRIMARY KEY,name VARCHAR(50),INDEX idx_name (name) -- 普通索引 );-- 已有表添加 CREATE INDEX idx_name ON user(name); -- 或 ALTER TABLE user ADD INDEX idx_name (name);
4. 复合索引(多列索引)
- 特点:对多个列联合创建索引,遵循 “最左前缀原则”(查询需包含最左列才可能生效)。
- 适用场景:频繁按多列组合查询(如
WHERE a=? AND b=?
)。 - 创建方式:
-- 对name和age创建复合索引 CREATE INDEX idx_name_age ON user(name, age);-- 有效查询(包含最左列name) SELECT * FROM user WHERE name='张三' AND age=20; -- 索引生效 SELECT * FROM user WHERE name='张三'; -- 索引生效(仅用name部分)-- 无效查询(不包含最左列name) SELECT * FROM user WHERE age=20; -- 索引不生效
5. 全文索引(FULLTEXT)
- 特点:用于全文搜索(如文章内容、长文本),仅支持
CHAR
、VARCHAR
、TEXT
类型,MyISAM 和 InnoDB(5.6+)支持。 - 创建方式:
-- 建表时指定 CREATE TABLE article (id INT PRIMARY KEY,content TEXT,FULLTEXT INDEX idx_content (content) -- 全文索引 );-- 查询(需用MATCH...AGAINST语法) SELECT * FROM article WHERE MATCH(content) AGAINST('数据库 索引' IN BOOLEAN MODE);
二、索引的使用场景
查询频繁的列:对
WHERE
、JOIN
(关联条件)、ORDER BY
、GROUP BY
涉及的列创建索引。
例:SELECT * FROM user WHERE name='张三'
→ 对name
建索引。区分度高的列:如身份证号(几乎唯一)比性别(只有 2 个值)更适合建索引,区分度低的索引效率差。
避免索引失效:以下情况索引可能不生效,需特别注意:
- 索引列使用函数:
WHERE SUBSTR(name, 1, 1)='张'
(可用复合索引或生成列索引优化)。 - 模糊查询以
%
开头:WHERE name LIKE '%三'
(LIKE '张%'
则索引生效)。 - 索引列参与运算:
WHERE id+1=10
(应改为WHERE id=9
)。 OR
连接非索引列:WHERE name='张三' OR age=20
(若age
无索引,整个查询可能全表扫描)。- 隐式类型转换:如
phone
是字符串,查询WHERE phone=13800138000
(应加引号'13800138000'
)。
- 索引列使用函数:
三、索引的维护
删除索引:
-- 删除普通索引 DROP INDEX idx_name ON user;-- 删除主键索引(需先移除自增等属性) ALTER TABLE user DROP PRIMARY KEY;
查看索引:
-- 查看表中所有索引 SHOW INDEX FROM user;
重建索引:当索引碎片较多(如频繁删除 / 更新),可重建优化性能:
-- 重建表所有索引(InnoDB有效) ALTER TABLE user ENGINE=InnoDB;
四、最佳实践
- 不要过度索引:索引会占用存储空间,且降低插入 / 更新 / 删除的效率(需维护索引结构)。
- 复合索引顺序:将查询频率高、区分度高的列放在前面(最左前缀原则)。
- 小表无需索引:数据量少时(如几百行),全表扫描可能比索引查询更快。
合理使用索引能显著提升查询性能,但需结合业务场景设计,避免盲目创建。