小仙女讲InnoDB(1)——索引

小仙女讲InnoDB(1)——索引_第1张图片

欢迎来到“小仙女讲故事”,这集我们说说索引。
小仙女讲InnoDB(1)——索引_第2张图片

索引是什么

索引是对数据表中一列或多列的值进行排序的一种存储结构,使用它的目的是能加快查询表中数据时的速度。

1、索引——超市理货员

如果我们把数据库比作一个超市,那一排排货架就是数据库中的列,索引就相当于超市的理货员。如果某一排货架人流量较大,那我们就需要安排一个理货员,把东西按类别整理一下。比如洗衣液的同一个牌子放在一起等。
小仙女讲InnoDB(1)——索引_第3张图片
如果某一排货架人流比较少,或者总是运来新货,或者只有少数几样物品,比如只有香蕉和苹果。那就没有必要安排理货员时刻盯着进行整理。毕竟雇理货员也是需要成本的。
一句话:索引是用来将数据进行排序的,但并不是所有的场景都适合加入索引。

2、分类

(1)B+树索引
这是最常用的索引,接下来都是对其的介绍。

(2)全文索引
全文索引用于将存储于数据库中的整本书或整篇文章中的任意内容查找出来的技术。其使用倒排索引来实现。其特点是:

  • 每张表只能有一个全文检索的索引
  • 不支持没有单词界定符的语言,比如中文、日语、韩语等。

(3)哈希索引:
哈希索引是一个“佛系索引”,其是根据表的使用情况自动生成的,人为无法干预。

3、适用场景

(1)经常需要搜索的列
(2)主键列
(3)经常用在连接的列上,可加快连接的速度
(4)经常需要根据范围进行搜索的列
(5)经常需要排列的列上
(6)经常使用在where子句中的列

4、不适用场景

(1)修改大于查询次数的列
(2)很少数据值的列,比如性别
(3)数据类型为text、image、bit的列,因为这些列的数据量要么挺大,要么挺小,不利于使用索引

B+树索引是什么

1、概念

最常用的索引,其本质就是B+树在数据库中的实现。

2、啥叫B+树

B+树是为磁盘设计的一种平衡查找树。其所有的记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接。如下就是一个B+树,其高度为2,每页可存放4条记录,扇出为5。
我们可对其进行添加和删除操作。
小仙女讲InnoDB(1)——索引_第4张图片

3、特点:

(1)高扇出性,B+树的高度一般都在2-4层,也就是说查找某一键值的行记录时,只需要2-4次IO。
(2)其存储形式为key-value,我们可以通过key值来找到具体的值。
(3)使用此索引只能查到对应的页,然后数据库通过把页读到内存,再在内存中查找要找的数据。

B+树索引分类

B+数索引分为聚集索引和辅助索引。其区别是叶子节点存放的是否为一整行的信息。

1、聚集索引

(1)概念?
聚集索引是指数据库表行中数据的物理顺序和键值(一般为主键)的逻辑顺序相同。
其就像新华字典,聚集索引就是前面的拼音,物理存储就是后面的汉字,汉字的特点是:以a开头的汉字列举完后,才开始列举以b开头的。
小仙女讲InnoDB(1)——索引_第5张图片
第一列的“地址”列表示该行数据在磁盘中的物理地址,后面的“id、username、score”3列是我们sql表中的列。可以看到,数据行的物理顺序与列值的顺序相同。

(2)特点?

  • 跟全文索引一样,聚集索引在一个表中只能拥有一个
  • 在查询方面,聚集索引的速度更占优势
  • 叶子节点的数据就是用户所要查询的数据

2、 辅助索引

(1)概念?
辅助索引中索引的逻辑顺序与磁盘中行的物理存储顺序不同,叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,还存储了一个指向该行数据的聚集索引建的书签。

(2)特点?
一张表中可以有多个辅助索引

怎么使用B+树索引

1、新建和删除

对索引的创建和删除有两种方式可供选择:

// 方式1——新建索引
ALTER TABLE student
ADD id varchar

//方式1——删除索引
ALTER TABLE student
DROP id varchar

//方式2——新建索引
CREATE INDEX student_id
ON student (id)

//方式2——删除索引
DROP INDEX student_id
ON student (id)

2、查看表中索引的信息

show index

3、联合索引

联合索引指对表上的多个列进行索引。
小仙女讲InnoDB(1)——索引_第6张图片
新建实例如下:

CREATE  TABLE  student(
       a int,
       b int,
       PRIMARY KEY(a),
       KEY idx_a_b (a,b)
)ENGINE=INNODB

特点:
我们知道,如果对如下查询,显然是可以使用(a,b)这个联合索引的。

select * from student where a=1 and b=2

但是对于单个列的查询呢?比如这样的:

select * from student where a=1

单独对a的查询是可以使用此索引的。但是对于b列的查询,不可以使用。因为从上图中明显看到,b列的值是非序的。

4、覆盖索引

SQL只需要通过索引就可以返回查询所需要的数据,而不必通过二级索引查到主键之后再去查询数据。
其好处是辅助索引不包含整行记录的所有信息,所以其大小要远小于聚集索引,因为可以减少大量的IO操作。

适用场景

1、只要有索引,查询必走索引吗?NO

并不是我们建立索引之后,只要查询必走索引。mysql优化器可能会觉得走索引效率不高,从而不走索引,而走全表扫描。

2、什么时候适合添加索引?

某列的值取值很广,几乎没有重复值的时候适合添加索引。数据库中存在两种类型的应用:OLTP、OLAP。
(1)OLTP
Online Transactional Processing,联机事务处理。此应用的特点是查询操作只从数据库中取得一小部分的数据,一般可能都在10条记录以下,甚至很多时候只取一条记录,比如根据主键值来取得用户信息等。
此时适合建立B+树索引。

(2)OLAP
Online AnalyticalProcessing,联机分析处理。此应用需要访问表中的大量数据,然后对这些数据进行分析。比如这个月每个用户的消费情况等。是否需要加B+树索引,要根据情况而定。不过一般会对时间字段进行索引,因为大多数统计需要根据时间维度来进行数据的筛选。

3、Cardinality——是否有必要给此字段添加索引

Cardinality表示索引中不重复记录数量的预估值。比如以下表中,3列的Cardinality值分别为:3、2、1。这样比较下来,对id列添加索引是挺合算的。·
小仙女讲InnoDB(1)——索引_第7张图片
这个值会作为mysql优化器对语句执行计划进行判定时的依据,如果此值太小,优化器就会认为如果走索引效率会低,从而不走索引。

你可能感兴趣的:(•基础,——【数据库】)