共计 2183 个字符,预计需要花费 6 分钟才能阅读完成。
这篇文章给大家介绍什么是 MySQL 索引,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
前言:
索引是 MySQL 数据库中的重要对象之一,索引的目的在于提高查询效率。可以类比字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。需要说明的是,MySQL 支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同。为了避免混乱,本文将只关注于 InnoDB 引擎下的 B +Tree 索引。
1. 索引结构及原理
要想了解索引的原理,首先要知道索引的结构,下面简单介绍下 B +Tree 索引的结构。
首先我们要知道索引是一种数据结构。在 InnoDB 中,每个索引其实都是一颗 B + 树,B+ 树是为了磁盘及其他存储辅助设备而设计的一种平衡查找树 (不是二叉树),在 B + 树中,所有的数据都在叶子节点,且每一个叶子节点都带有指向下一个节点的指针,形成了一个有序的链表。一般情况下数据库的 B + 树的高度一般在 2~4 层,这就是说找到某一键值的行记录最多需要 2 到 4 次逻辑 IO,下图简单展示了 B + 树索引的结构。
2. 索引的分类及创建方法
在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。根据叶子节点的内容,索引类型分为主键索引和非主键索引。主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。非主键索引的叶子节点内容是索引列和主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)或辅助索引
一张 InnoDB 表必须有一个聚簇索引,当有主键时,会以主键作为聚簇索引;如果没有显式定义主键,InnoDB 会选择一个唯一的非空索引代替。如果没有这样的索引,则 MySQL 自动为 InnoDB 表生成一个隐含字段作为主键。除聚簇索引外的其他索引都可称为二级索引,比如我们常用到的唯一索引、普通索引、联合索引等。
上面讲过聚簇索引的叶子节点存的是整行数据,当某条查询使用的是聚簇索引时,只需要扫描聚簇索引一颗 B + 树即可得到所需记录,如果想通过二级索引来查找完整的记录的话,需要通过回表操作,也就是在通过二级索引找到主键值之后再到聚簇索引中查找完整的记录。也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。
下面介绍下索引的创建、删除等操作方法。
# 建表时指定索引
CREATE TABLE `t_index` ( `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT 自增主键 ,
`col1` int(11) NOT NULL,
`col2` varchar(20) NOT NULL,
`col3` varchar(50) NOT NULL,
`col4` int(11) NOT NULL,
PRIMARY KEY (`increment_id`),
UNIQUE KEY `uk_col1` (`col1`),
KEY `idx_col2` (`col2`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT= 测试索引
# 创建索引 (两种方法)
# 普通索引
alter table `t_index` add index idx_col3 (col3);
create index idx_col3 on t_index(col3);
# 唯一索引
alter table `t_index` add unique index uk_col4 (col4);
create unique index uk_col4 on t_index(col4);
# 联合索引
alter table `t_index` add index idx_col3_col4 (col3,col4);
create index idx_col3_col4 on t_index(col3,col4);
# 删除索引
alter table `t_index` drop index uk_col4;
DROP INDEX idx_col3_col4 on t_index;
3. 索引的优缺点及使用建议
索引的优点显而易见是可以加速查询,但创建索引也是有代价的。首先每建立一个索引都要为它建立一棵 B + 树,会占用额外的存储空间;其次当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。所以,索引的创建及使用时有原则的,下面给出几点索引使用的建议:
显式创建主键索引,建议使用自增 ID 作为主键。
只为用于搜索、排序、分组、连接的列创建索引。
对经常更新的表避免创建过多的索引。
建立联合索引时,可选择性高的列放在前面。
尽量不要在可选择性差的列上建索引,如:性别、状态列等。
尽量使用覆盖索引进行查询,避免回表带来的性能损耗。(覆盖索引包含要查询的所有列)
select 后面只写查询需要用到的字段,去掉不需要的字段。
定位并删除表中的重复和冗余索引。
关于什么是 MySQL 索引就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。