MySQL之索引基础

2019-11-06 16:19:29 浏览数 (1)

MySQL之索引基础
索引是应用程序设计和开发的一个重要方面,过多的索引会影响程序的性能,而索引过少又会对查询性能产生影响,要找到一个合适的平衡点,并不是一件容易的事情。

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)在频繁进行排序或者分组的列上简历索引,如果待排序的列有多个,可以在这些列上建立组合索引。

0 人点赞