注意:未定义的索引:_数据分析所需了解的索引知识,一文带你纵览全貌

本文介绍了数据库索引的基础知识,包括索引的作用、Btree索引的演变过程(二叉树、平衡树、B-树、B+树)以及常见的索引类型(普通索引、唯一索引、主键索引、组合索引和全文索引)。重点阐述了B+树作为主流索引结构的原因,并提出了在查询中需要注意的索引使用细节,以提高数据查询效率。
摘要由CSDN通过智能技术生成

数据库的每一个知识点真要详细介绍的话都可以写成一本小册子,索引也不例外,但没那个必要。作为数据分析师或非数据库开发人员,所需了解的仅仅是下面这些知识点。

什么是索引


索引是为了加速对数据库表中数据行的检索而创建的一种分散的存储结构。这话有些人可能看着拗口,但如果将索引比喻成字典的目录那就很好理解了。借助对目录的了解可以加深我们对索引的理解。

267a410c6b6ba7fed49330966148cd00.png

上表所列的是二者的共性特点,理解这些后就对索引的优缺点有了一个大致的认识。

索引原理


索引按照存储结构类型可主要分为Btree(也称B树)和Hash两大类型,其中Btree最为常用。Mysql数据库默认的引擎是InnoDB引擎,该引擎的表默认创建的是Btree索引。所以,主要掌握该索引就够了。

Btree是树结构索引,它的原理就是通过为表创建树形状的存储结构从而加快查询效率。它经历了二叉树、平衡树、B-树、B+树的优化历程。掌握了这一变化历程,也就掌握了B树索引的原理。

我们以斐波那契数列的前8位数[1,2,3,5,8,13,21]作为索引值,看看不同树结构下会是怎样的存储结构。

(1)二叉树

下图的存储结构就是二叉树,按照这个结构,我们查询某一个数字最多只需要5次,也就是树的高度。

c92aea1d9794215308f8e2b66b25c0a9.png

二叉树具有如下特点:

  • 每个结点都包含一个元素以及n个子树,0≤n≤2;
  • 左子树的值要小于父结点,右子树的值要大于父结点。

但二叉树存在着一个缺点,随着后续的数字添加进来,会全部添加到右子树,该树就会严重右偏,退化成差不多一个链表了,查询效率也就大大降低了。

(2)平衡树

平衡树是一种特殊的二叉树,它是为了解决二叉树偏科的问题而诞生的。它除了具备二叉树的两个特性外,还具有左右两个子树高度差不超过1的特性,并且左右两个子树都是一棵平衡二叉树。

350d692d7f7c977541c6cfc742dfa600.png

但平衡树中每个节点只能有一个值,在数据量大的情况下会需要多个节点,树的深度很很大,这就会大量增加和磁盘的IO次数,影响查询性能。

(3)B-树

B-树的节点就可以不止有一个数了,除了有键值,还存有数据。相比平衡树,它的形状属于更矮更胖,与磁盘的IO次数就会大大降低。

b19ff609d6030f1dcd45772a770b20b7.png

但也正是由于节点中包含了数据,导致每次从磁盘读入到内存的键值数就会降低,在这种情形下还是会一定程度增加磁盘的IO次数,从而影响查询效率。

(4)B+树

B+树是对B-树的优化,所有的非叶子节点只存储键值信息,所有数据都存在叶子节点中,叶子节点之间都有一个链指针。

8da1527e140523ddf9e1d45076caf83e.png

由于数据全部存储在叶子节点中,非叶子节点只包含键值,每次读入内存的键值相对B-树来说就会增加,从而降低磁盘IO次数、提升查询效率。

这也是为什么目前索引均主要是采用B+树结构的原因。

索引类型


索引一般可分为普通索引、唯一索引、主键索引、组合索引和全文索引五类。

(1)普通索引

这是最基本的索引,没有任何限制,如下是常用的普通索引增删查改方式。

create index indexname on test_one(column_one);--建立索引alter table test_one add index indexname(column_one);--建立索引drop index indexname on test_one;--删除索引show index from test_one;--查看表的索引select * from information_schema.statistics where table_schema='test_one';--查看数据库的索引

(2)唯一索引

与普通索引类似,不同的就是索引列值必须唯一,但允许有空值。例如,可以对用户的身份证号码字段建立唯一索引。关于它的相关语句就是需要添加unique字段,仅以创建为例,其它以此类推。

create unique index indexname on test_one(column_one);--建立索引

(3)主键索引

主键索引也称聚集索引,它与其它索引的区别在于其叶子节点存放的数据是一整行数据,而其它索引存放的只是具体的某一个数据。

如果表在创建时未定义主键,MySQL会取第一个唯一索引而且只含非空的列作为主键,并用它作为聚集索引。如果没有这样的列,就会就自动产生一个这样的ID值,它有六个字节,而且是隐藏的,使其作为聚集索引。当然,在表创建好之后,也可通过指定主键来创建主键索引。

alter table test_one add primary key(column_one);

(4)组合索引

这是指在多个字段上创建的索引,但要注意只有在查询条件中使用了创建索引时的第一个字段,组合索引才会被使用。

alter table test_one add index indexname(column_one,column_two);

(5)全文索引

全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。例如,对备注信息就可以建立全文索引。

alter table test_one add fulltext indexname(column_one);

注意事项


数据分析师更多地是在写查询SQL时使用索引,这时需注意以下这些细节:

  • 以%开头的like查询无法使用索引;
  • 数据类型出现隐式转换时无法使用索引;
  • 不满足最左原则的复合索引查询无法使用索引;
  • or分隔开的条件中若有一列没有索引,则涉及到的索引都无法使用;
  • 在索引列使用函数或进行运算的查询无法使用索引;
  • not in和<>的查询无法使用索引。

结语


文中所介绍的索引知识点,对于数据分析师了解索引内容而言是足够了的。但也毕竟只是在广度上做了介绍,就有如限定了考试范围,而在有些地方的深度介绍还不够,这就需要每个人结合自身实际情况去查漏补缺了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值