什么是索引
数据库中索引(Index)是一种帮助快速查找数据的数据结构,可以把它理解为书的目录,通过索引能够快速找到数据所在位置。
索引的好处
场景的索引数据结构有:Hash表(通过hash算法快速定位数据,但不适合范围查询,因为需要每个key都进行一次hash)、二叉树(查找和修改效率都比较高),但是在InnoDB引擎中使用的索引是B+Tree,相较于二叉树,B+Tree这种多叉树,更加矮宽,更适合存储在磁盘中。
索引的坏处
使用索引增加了数据查找的效率,但是相对的由于索引也需要存储到磁盘,所以增加了存储的压力,并且新增数据时需要同步维护索引。但是合理的使用索引能够极大提高我们的效率!
创建索引的三种方式
-
在执行create table时创建索引
create table user_index( id int auto_increment primary key, first_name varchar(16), last_name varchar(16), id_card varchar(18), information text(225), key name( first_name,last_name), fulltext key(information), unique key(id_card) );
-
使用alter table添加索引
alter table table_name add index index_name(column_list);
-
使用create index命令创建索引
create index index_name on table_name(column_list);
索引类型
-
普通索引
create index index_name on table_name(column_list);
-
唯一索引
create unique index index_name on table_name(column_list);
-
主键索引
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) )
-
组合索引
ALTER TABLE `table` ADD INDEX name_city_age (name,city,age);
-
全文索引
B+树
为了提高查找速度,其常用的数据结构是一个N叉搜索树。
原因:用N叉的目的就是能够减少高度,使得查找次数变少,效率就提高了。
这个N叉搜索树具体是什么?
我们先来认识一下B树。
B树的特点:
- N叉搜索树,每个结点可能会包含N个子树
- 每个结点都存在多个值
- 保证类似二叉搜索树一样的规则(左子树小于根节点,小于右子树)
(图片来源于知乎)
而B+树与B树的不同之处表现在:
- 非叶子节点的值,可能会有重复 ====》就能保证最终的叶子结点这一层,就是完整的数据集合
- 通过类似于链表的方式,把所有的叶子结点按照顺序连接起来。
B+树的最大优点是:
-
非常善于范围查找
-
所有的查询最终都是落在叶子结点上,查询速度树比较稳定的。
-
由于叶子结点是数据的全集,因此就可以把叶子结点存到硬盘上,非叶子结点直接存到内存中,又进一步的大大降低了读取硬盘的次数。
重要
为什么索引结构默认使用B+树,而不是B-Tree,Hash哈希,二叉树,红黑树?
- Hash哈希,只适合等值查询,不适合范围查询。还会产生哈希冲突。
- 一般二叉树,可能会特殊化为一个链表,相当于全表扫描。
- 红黑树,是一种特化的平衡二叉树,MySQL 数据量很大的时候,索引的体积也会很大,内存放不下的而从磁盘读取,树的层次太高的话,读取磁盘的次数就多了。
- B-Tree,叶子节点和非叶子节点都保存数据,相同的数据量,B+树更矮壮,也是就说,相同的数据量,B+树数据结构,查询磁盘的次数会更少。
综上,索引更适用于查找多,修改少的场景。
聚簇索引
每一个叶子结点都存放一条数据
非聚簇索引
通过一个表这样的结构,把所有的数据都装进去。
聚簇索引和非聚簇索引的区别
两者主要的区别是数据和索引的分离,聚簇不分离,非聚簇分离