【数据库】索引

索引是数据库中加速数据查找的数据结构,如书的目录。它使用B+树降低查找高度,提高效率。索引虽增加存储需求,但合理使用能极大提升查询速度。创建索引有三种方式,包括在创建表时、使用ALTERTABLE或CREATEINDEX命令。聚簇索引的叶子节点存储数据,而非聚簇索引数据与索引分离。
摘要由CSDN通过智能技术生成

什么是索引

数据库中索引(Index)是一种帮助快速查找数据的数据结构,可以把它理解为书的目录,通过索引能够快速找到数据所在位置。

索引的好处

场景的索引数据结构有:Hash表(通过hash算法快速定位数据,但不适合范围查询,因为需要每个key都进行一次hash)、二叉树(查找和修改效率都比较高),但是在InnoDB引擎中使用的索引是B+Tree,相较于二叉树,B+Tree这种多叉树,更加矮宽,更适合存储在磁盘中。

索引的坏处

使用索引增加了数据查找的效率,但是相对的由于索引也需要存储到磁盘,所以增加了存储的压力,并且新增数据时需要同步维护索引。但是合理的使用索引能够极大提高我们的效率!

创建索引的三种方式

  1. 在执行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)
    );
    
  2. 使用alter table添加索引

    alter table table_name add index  index_name(column_list);
    
  3. 使用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树的特点:

  1. N叉搜索树,每个结点可能会包含N个子树
  2. 每个结点都存在多个值
  3. 保证类似二叉搜索树一样的规则(左子树小于根节点,小于右子树)

img

(图片来源于知乎)

而B+树与B树的不同之处表现在:

  1. 非叶子节点的值,可能会有重复 ====》就能保证最终的叶子结点这一层,就是完整的数据集合
  2. 通过类似于链表的方式,把所有的叶子结点按照顺序连接起来。

B+树的最大优点是:

  1. 非常善于范围查找

  2. 所有的查询最终都是落在叶子结点上,查询速度树比较稳定的。

  3. 由于叶子结点是数据的全集,因此就可以把叶子结点存到硬盘上,非叶子结点直接存到内存中,又进一步的大大降低了读取硬盘的次数。

重要

为什么索引结构默认使用B+树,而不是B-Tree,Hash哈希,二叉树,红黑树?

  • Hash哈希,只适合等值查询,不适合范围查询。还会产生哈希冲突。
  • 一般二叉树,可能会特殊化为一个链表,相当于全表扫描。
  • 红黑树,是一种特化的平衡二叉树,MySQL 数据量很大的时候,索引的体积也会很大,内存放不下的而从磁盘读取,树的层次太高的话,读取磁盘的次数就多了。
  • B-Tree,叶子节点和非叶子节点都保存数据,相同的数据量,B+树更矮壮,也是就说,相同的数据量,B+树数据结构,查询磁盘的次数会更少。

综上,索引更适用于查找多,修改少的场景。

聚簇索引

每一个叶子结点都存放一条数据

非聚簇索引

通过一个表这样的结构,把所有的数据都装进去。

聚簇索引和非聚簇索引的区别

两者主要的区别是数据和索引的分离,聚簇不分离,非聚簇分离

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值