数据库的每一个知识点真要详细介绍的话都可以写成一本小册子,索引也不例外,但没那个必要。作为数据分析师或非数据库开发人员,所需了解的仅仅是下面这些知识点。
索引是为了加速对数据库表中数据行的检索而创建的一种分散的存储结构。这话有些人可能看着拗口,但如果将索引比喻成字典的目录那就很好理解了。借助对目录的了解可以加深我们对索引的理解。
上表所列的是二者的共性特点,理解这些后就对索引的优缺点有了一个大致的认识。
索引按照存储结构类型可主要分为Btree(也称B树)和Hash两大类型,其中Btree最为常用。MySQL数据库默认的引擎是InnoDB引擎,该引擎的表默认创建的是Btree索引。所以,主要掌握该索引就够了。
Btree是树结构索引,它的原理就是通过为表创建树形状的存储结构从而加快查询效率。它经历了二叉树、平衡树、B-树、B+树的优化历程。掌握了这一变化历程,也就掌握了B树索引的原理。
我们以斐波那契数列的前8位数[1,2,3,5,8,13,21]作为索引值,看看不同树结构下会是怎样的存储结构。
(1)二叉树
下图的存储结构就是二叉树,按照这个结构,我们查询某一个数字最多只需要5次,也就是树的高度。
二叉树具有如下特点:
但二叉树存在着一个缺点,随着后续的数字添加进来,会全部添加到右子树,该树就会严重右偏,退化成差不多一个链表了,查询效率也就大大降低了。
(2)平衡树
平衡树是一种特殊的二叉树,它是为了解决二叉树偏科的问题而诞生的。它除了具备二叉树的两个特性外,还具有左右两个子树高度差不超过1的特性,并且左右两个子树都是一棵平衡二叉树。
但平衡树中每个节点只能有一个值,在数据量大的情况下会需要多个节点,树的深度很很大,这就会大量增加和磁盘的IO次数,影响查询性能。
(3)B-树
B-树的节点就可以不止有一个数了,除了有键值,还存有数据。相比平衡树,它的形状属于更矮更胖,与磁盘的IO次数就会大大降低。
但也正是由于节点中包含了数据,导致每次从磁盘读入到内存的键值数就会降低,在这种情形下还是会一定程度增加磁盘的IO次数,从而影响查询效率。
(4)B+树
B+树是对B-树的优化,所有的非叶子节点只存储键值信息,所有数据都存在叶子节点中,叶子节点之间都有一个链指针。
由于数据全部存储在叶子节点中,非叶子节点只包含键值,每次读入内存的键值相对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时使用索引,这时需注意以下这些细节:
文中所介绍的索引知识点,对于数据分析师了解索引内容而言是足够了的。但也毕竟只是在广度上做了介绍,就有如限定了考试范围,而在有些地方的深度介绍还不够,这就需要每个人结合自身实际情况去查漏补缺了!