Skip to content

mysql的索引

一、mysql中的索引

索引(在mysql中也叫做“键”)是存储引擎用于快速找到记录的一种数据结构,这是索引的基本功能。索引对于中大型的表就非常有效,对于特大型的表,需要一种技术可以直接区分出查询需要的一组数据,而不是一条一条记录的匹配,比如分区技术。

二、索引的优点

索引可以让服务器快速定位到表的指定位置。索引具备以下三个优点:

  1. 索引可以大大减少服务器需要扫描的数据量
  2. 索引可以帮助服务器避免排序和临时表
  3. 索引可以将随机的I/O变为顺序的I/O

三、索引的类型

mysql的索引分为两大类,聚簇索引和非聚簇索引。

聚簇索引:也叫聚集索引,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引, 即如果存在聚集索引,就不能再指定CLUSTERED 关键字。innoDB当中的主键索引就是聚簇索引,但是不一定是根据主键聚簇的。1、有主键的情况下 , 主键就是聚簇索引;2、没有主键的情况下 , 第一个非空null的唯一索引就是聚簇索引;3、如果上面都没有 , 那么就是有一个隐藏的row-id作为聚簇索引。

非聚簇索引:非聚簇索引记录的物理顺序与逻辑顺序没有必然的联系,与数据的存储物理结构没有关系;一个表对应的非聚簇索引可以有多条,根据不同列的约束可以建立不同要求的非聚簇索引;关键字:NOCLUSTERED

聚簇索引和非聚簇索引的索引页每页的大小都是16K,并且不可修改。

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

  • 存储特点:聚集索引按索引顺序来存储,索引项顺序与表中记录的物理顺序一致,叶子节点即存储了真实数据行,不再有另外的单独数据页,一张表上最多只有一个聚集索引;非聚集索引表的存储顺序与索引顺序无关,仅仅索引项的逻辑上是连续的,叶子节点存储了索引字段值以及指向数据页数据行的逻辑指针,其行数量与数据表行数据量一致。
  • 更新表数据的区别:插入数据:无聚集索引的表,表中数据行没特定顺序,新行皆被添加到表的末尾;有聚集索引的表,先根据索引找到对应的数据页,挪动已有记录为新数据腾出空间后插入,若数据页已满,则拆分数据页,调整索引指针(若表中有非聚集索引,则更新索引指向新的数据页); 删除数据:无聚集索引的表,直接删除(留下内存空洞);有聚集索引的表,删除行将导致其下的数据行向上移动以填补空白,若删除的行为数据页最后一行,则回收该数据页,相应索引页中记录也被删除

在这两大类的索引类型下,还可以将索引分成这几个小类:

  1. 普通索引:最基本的索引类型,没有唯一性之类的限制,仅加速查询
  2. 唯一索引:唯一索引是不允许其中任何两行具有相同索引值的索引,加速查询 + 列值唯一(可以有一个或者多个null)
  3. 主键索引:简称为主索引,数据库表中一列或列组合(字段)的值唯一标识表中的每一行,加速查询 + 列值唯一(不可以有null)+ 表中只有一个主键索引
  4. 组合索引:将几个列作为一条索引进行检索,使用最左匹配原则。
  5. 全文索引:全文索引(FULLTEXT)5.6以前仅可以适用于MyISAM引擎的数据表,5.6以后innodb支持;作用于CHAR、VARCHAR、TEXT数据类型的列。
  6. 空间索引:使用SPATIAL参数可以设置空间索引。空间索引只能建立在空间数据类型(LINESTRING、POINT、GEOMETRY等)上,这样可以提高系统获取控件数据的效率。MySQL中只有MyISAM存储引擎支持空间索引,且该字段不能为空值。

四、索引的方法

Mysql目前主要有以下几种索引类型的方法:FULLTEXT,HASH,BTREE,RTREE。

  1. FULLTEXT:即为全文索引,其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。

  2. HASH:由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。

  3. BTREE:BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。

  4. RTREE:RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。相对于BTREE,RTREE的优势在于范围查找。