本文关键字:数据库、MySQL、索引的作用、常用索引
在使用数据库的过程中,经常会进行数据的查询。随着数据量的增大,查询的时间会变的原来越长,这就需要合理的建立索引来提高查询效率。
一、索引概述
1. 数据库检索
在讲述索引之前我们要先来简单介绍一下数据库中是如何进行数据查询的,这更有助于我们理解索引。对于数据库来说,本质上是一个软件,或者可以称为一个系统,提供了对于数据管理的功能。存放在数据表中的数据其实同样是存储在磁盘上,对于不同的数据库,会以不同的数据格式文件存在。
在进行数据库检索时,尤其是条件查询,解析SQL指令后,本质上是对数据存储文件的扫描。我们所使用的绝大部分关系型数据库的表结构采用的都是行式存储,也就是一条数据是一行,每一列的数据是在这一行中以某种分隔符来分隔。数据库在进行数据扫描时也是通过游标(cursor)以行为单位来进行操作,与之相对的就是列式存储(column table),比如HANA。
那么在进行条件查询时,会逐行进行扫描,通过移动游标指定到不同的行,然后再获取到对应的列的值,比对,确定结果,在数据量比较小的时候我们可以忽略时间问题,但当数据量很大时(千万级)问题就很明显了,查询速度很难接受,在使用索引前,数据查询的过程可以这样表示:
2. 索引的作用
说到索引,大家一定都很熟悉目录,如果我们把数据表看成一本书的话,没有索引的数据表就好像一本没有目录的书,并且内容之间也没什么顺序可言,那我们除了一页一页去翻又有什么办法呢?
如果我们将一条数据比作一页,每列数据就相当于这一页的内容。这时我们使用索引就可以建立起某列数据与某一条数据的关系,也就是说给定一个查询条件和信息,我就能够定位到数据的所在位置。
那么索引的工作原理和目录很类似,一旦我们创建了索引,就相当于为整本书创建了一个动态的目录,为什么是动态?因为数据是会被修改的嘛。当建立索引的列的数据被修改时,索引中也要及时的更新,保证对应关系是正确的,建立所以后,数据的查询的过程可以这样表示:
敲黑板:建立了索引后,当被声明了索引的列作为条件或排序的列使用时,速度就会明显提升。也就是说,索引建立以后是个被动技能,符合了使用规则就会自动触发。
3. MySQL索引存储类型
在MySQL中,根据存储和映射方式的不同可将索引分为两种:
- B-Tree:MySQL中使用最为频繁的索引类型,是以树形结构和节点的方式管理。
- Hash:Hash索引主要用于等值过滤,在这一点上效率要高于B-Tree,但不支持范围查询。
二、MySQL常见索引
每一个索引都是建立在一个列上的,一个数据表中可以为多个列声明索引。在MySQL数据库中,常用的索引根据用途和作用效果可以被分为以下几类:
1. 普通索引
普通索引是MySQL中最基本索引类型,基本上对列的数据不会加任何的限制,可以允许空值和重复值,最主要的用途就是加快数据的访问速度。
2. 唯一索引
唯一索引指的是对数据添加了唯一性约束,这一列的数据当中不能够出现重复的值,但是可以有null值(至多有一个)。在创建唯一索引时会进行数据校验,如果此时已经有了重复数据,则索引创建失败。在建立唯一索引后,再向表中插入已有的重复数据时,也会被拒绝。
3. 主键索引
主键索引的特点是:非空、唯一。所以如果我们想找一列作为每条数据的唯一标识,就会将这一列声明为主键。由于主键的特点,经常会被作为其他表外键的参照列,也是在进行数据同步时的主要参照。
4. 复合索引
同一索引类型作用在多个不同列上时,可以称之为组合索引,对于主键索引,有一个特别的称呼:复合主键。(注意:复合主键与联合主键不是同一个含义,联合主键指的是将多个主键的值联合在一起,常出现在多对多逻辑的中间表中,比如:将两个有关联的数据主键定义在中间表中,然后再为中间表设立一个主键来唯一标识每一条关联数据)
5. 全文索引
全文索引主要是作用在数据类型为CHAR、VARCHAR、TEXT的列上,用于长文本的字符串搜索加速。使用全文索引时,自然语言搜索的效率要大于LIKE关键字。
6. 空间索引
空间索引主要是针对空间数据类型的列建立的,如:GEOMETRY。如果在某一列上建立空间索引,则必须声明为:NOT NULL,只有MyISAM引擎的表支持空间索引。