innodb存储引擎支持B 树索引、全文索引以及哈希索引等常见的几种索引。需要注意的是,Innodb存储引擎支持的哈希索引是自适应的,Innodb存储引擎会根据表的使用情况自动为表生成哈希索引。B 树索引就是传统意义上的索引,它的构造类似于二叉树,根据key value键值对快速找到数据。
01
索引的优缺点
索引的优点很多,这里简单列举几条:
(1)使用唯一索引可以保证数据库表中的每行数据的唯一性;
(2)可以大大加快数据的查询速度;
(3)在实现数据的参考完整性方面,可以加速表和表之间的关联;
(4)在使用分组和排序自居进行数据查找时,可以显著减少查询中分组和排序的时间
过多的索引还会带来以下缺点:
(1)创建索引和维护索引需要耗费时间,并且随着数据量的增加所耗费的时间也会增加;
(2)索引需要占用磁盘空间,除了数据表占用磁盘空间之外,每一个索引还要占用一定的物理空间,如果有大量的索引,索引文件可能比数据文件还大;
(3)当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,降低了数据的维护速度。
02
索引的简单分类
索引的分类可以简单分为以下几种:
(1)普通索引和唯一索引
普通索引是MySQL中基本索引类型,允许在定义索引的列中插入重复值和空值;
代码语言:javascript复制CREATE TABLE book
(
bookid INT NOT NULL,
bookname VARCHAR() NOT NULL,
authors VARCHAR() NOT NULL,
info VARCHAR() NULL,
comment VARCHAR() NULL,
year_publication YEAR NOT NULL,
INDEX(year_publication)
);
唯一索引指的是索引列的值必须唯一,但是允许有控制,如果是组合索引,则列值的组合必须为宜;
代码语言:javascript复制CREATE TABLE t1
(
id INT NOT NULL,
name CHAR() NOT NULL,
UNIQUE INDEX UniqIdx(id)
);
主键索引是一种特殊的唯一索引,不允许有空值;
(2)单列索引和组合索引
单列索引指的是一个索引只包含一个列,一个表可以有多个单列索引;
代码语言:javascript复制CREATE TABLE t2
(
id INT NOT NULL,
name CHAR() NULL,
INDEX SingleIdx(name())
);
组合索引值得是在多个字段上组合创建索引,只有在查询条件中使用了这些字段左边的字段时,索引才会被使用。
代码语言:javascript复制CREATE TABLE t3
(
id INT NOT NULL,
name CHAR() NOT NULL,
age INT NOT NULL,
info VARCHAR(),
INDEX MultiIdx(id, name, age())
);
(3)全文索引
全文索引在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值,全文索引可以在char,varchar,text类型的列上创建。MyISAM存储引擎支持全文索引;
代码语言:javascript复制CREATE TABLE t4
(
id INT NOT NULL,
name CHAR() NOT NULL,
age INT NOT NULL,
info VARCHAR(),
FULLTEXT INDEX FullTxtIdx(info)
) ENGINE=MyISAM;
(4)聚集索引与非聚集索引
聚集(clustered)索引,也叫聚簇索引,类似字典中的拼音查询,它的定义:数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。MySQL里主键就是聚集索引。它的特点是非空,唯一。
非聚集(unclustered)索引,类似字典中的偏旁部首查询。它的定义:该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
关于这两种索引,后续会再进行分析。
(5)空间索引是对空间数据类型的字段建立的索引,这个不经常使用,这里不做赘述。
03
索引的设计原则
索引设计不合理或者缺少索引都会对数据库的性能造成障碍,高效的索引对于获得良好的性能十分重要,设计索引时考虑的准则大概有以下几种:
(1)索引不是越多越好,过多的索引维护起来不方便,而且占用磁盘空间;
(2)避免对经常更新的表进行过多的索引,而对于经常查询的字段,需要创建索引,但是要避免添加不必要的字段;
(3)数据量小的表最好不用索引,由于数据量小,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果;
(4)在不同值较多的列上建立索引,如果一个列是性别属性,那么最好不要建立索引,因为该字段只有两个不同值;
(5)当唯一性是某种数据本身的特征时,指定唯一索引,使用唯一索引能够确保定义的列的数据的完整性,从而提高查询速度。
(6)在频繁进行排序或者分组的列上简历索引,如果待排序的列有多个,可以在这些列上建立组合索引。