mysql索引
作者:YXN-sql 阅读量:150 发布日期:2024-05-22
索引的分类
在SQL中,索引是一种数据结构,它可以帮助数据库高效地查询、更新数据表中的数据。
MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引和空间索引等。
从功能逻辑上说,索引主要有4类:
- 普通索引
- 唯一索引:唯一索引不允许两个行有相同的索引值。
- 主键索引:一种特殊的唯一索引,用于唯一标识表中的每一条记录。
- 全文索引:用于MyISAM引擎,可以用于InnoDB(从MySQL 5.6开始支持),可以在CHAR、VARCHAR或者TEXT类型的列上创建。
按照作用字段个数进行划分,分成:
- 单列索引:在单个列上创建的索引。
- 联合索引:在多个列上创建的索引,可以用于联合查询优化。
按照物理实现方式,索引可以分为2种:
- 聚簇索引
- 非聚簇(cu)索引
1、普通索引
在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。例如,在表 student 的字段 name 上建立一个普通索引,查询记录时就可以根据该索引进行查询。
2、唯一索引
使用 UNIQUE 参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许有空值。在一张数据表里可以有多个唯一索引。
例如,在表 student 的字段 email 中创建唯一性索引,那么字段 email 的值就必须是唯一的。通过唯一性索引,可以更快速地确定某条记录
3、 主键索引
主键索引就是一种特殊的唯一性索引,在唯一索引的基础上增加了不为空的约束,也就是 NOT NULL + UNIQUE,一张表里最多只有一个主键索引。
4、全文索引
全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。全文索引非常适合大型数据集,对于小的数据集,它的用处比较小。
使用参数 FULLTEXT 可以设置索引为全文索引。在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值。全文索引只能创建在 CHAR、VARCHAR 或 TEXT 类型及其系列类型的字段上,查询数据量较大的字符串类型的字段时,使用全文索引可以提高查询速度。例如,表 student 的字段 infomation 是 TEXT 类型,该字段包含了很多文字信息。在字段 information 上建立全文索引后,可以提高查询字段 information 的速度
5、单列索引
在表的单个字段上创建索引。单列索引只根据该字段进行索引。单列索引可以是普通索引,也可以是唯一性索引,还可以是全文索引。只要保证该索引只对应一个字段即可。一个表可以有多个单列索引。
6、多列(组合、联合)索引
多列索引是在表的多个字段组合上创建一个索引。该索引指向创建时对应的多个字段,可以通过这几个字段进行查询,但是只有查询条件中使用了这些字段的第一个字段时才会被使用。例如,在表的字段 id、name 和 gender 上建立一个多列索引 idx_id_name_gender ,只有在查询条件中使用了字段 id 时该索引才会被使用。使用组合索引时遵循最左前缀集合
创建索引语句
-- 创建一个普通索引
CREATE INDEX index_name ON table_name(column_name);
-- 创建一个唯一索引
CREATE UNIQUE INDEX index_name ON table_name(column_name);
-- 创建一个全文索引
CREATE FULLTEXT INDEX index_name ON table_name(column_name);
-- 创建一个空间索引
CREATE SPATIAL INDEX index_name ON table_name(column_name);
-- 创建一个组合索引
CREATE INDEX index_name ON table_name(column1, column2, ...);
索引分析
检查索引是否存在
SHOW INDEX FROM users;
影响索引使用的常见原因
- 索引未覆盖查询条件:确保 WHERE、JOIN 或 ORDER BY 涉及的字段有索引。
- 数据类型不匹配:如字符串字段用数字查询(隐式转换导致索引失效)。
- 函数或表达式:如 WHERE UPPER(name) = 'ALICE' 会使索引失效,需使用函数索引。
- 数据分布问题:表中数据过少时,数据库可能选择全表扫描而非索引。
- 统计信息过期:更新统计信息(如 ANALYZE TABLE)以帮助优化器选择索引。
- 更多请看:mysql进阶篇之索引失效因素
查看查询是否使用索引
使用 EXPLAIN 命令分析执行计划
几乎所有数据库都支持 EXPLAIN 或类似命令,它能展示查询的执行路径,包括是否使用索引。
EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
关键字段解读:
- type:查询的访问类型,常见值:
-
- const/eq_ref/ref/range:表示使用了索引。
- index:全索引扫描(效率一般)。
- ALL:全表扫描(未使用索引,需优化)。
- possible_keys:可能使用的索引列表。
- key:实际使用的索引名称(如果为 NULL 则未使用索引)。
- rows:预估扫描的行数(越小越好)。
- Extra:额外信息,如 Using where(使用 WHERE 过滤)、Using index(覆盖索引)等。
示例输出:
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | rows | Extra | +----+-------------+-------+------+---------------+---------+---------+-------+ | 1 | SIMPLE | users | ref | idx_email | idx_email | 1 | Using index | +----+-------------+-------+------+---------------+---------+---------+-------+
这里 key=idx_email 表示使用了索引。
示例:判断索引使用场景
场景1:简单查询
EXPLAIN SELECT * FROM orders WHERE user_id = 100;
若 key 显示 idx_user_id,则使用了索引。
场景2:模糊查询
EXPLAIN SELECT * FROM products WHERE name LIKE '%apple%';
若 type=ALL,说明未使用索引(通配符在前缀时通常无法使用索引)。
YXN-sql
2024-05-22