sqlmysql数据库

Mysql索引杂谈

2017-01-11  本文已影响266人  ericsonyc

结论:索引是把双刃剑,可以提高数据库性能,也会影响数据库性能

  1. 利:
  1. 弊:

背景知识

Mysql索引

在Mysql中,索引是属于存储引擎级别的概念,因此不同的存储引擎对索引的实现方式是不同的,主要常用的是MyISAM和InnoDB两个存储引擎。(MyISAM提供表级锁,适用于基本上是查询操作的数据库;InnoDB提供行级锁,适用于更新,插入较频繁的表)

MyISAM和InnoDB两个存储引擎主要使用B+树做为索引。B+树是一个树形的数据结构,特点是:

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

聚簇索引和非聚簇索引
MyISAM索引结构:

MyISAM存储引擎中数据文件和索引文件是分离的。
MyISAM的索引主要分为主索引和辅助索引:MyISAM索引方式也称为“非聚集”索引

InnoDB索引结构:

InnoDB存储引擎也分为主索引和辅助索引:InnoDB索引方式也称为聚集索引
InnoDB和MyISAM最大的区别是:InnoDB数据文件本身就是索引文件。因为InnoDB的数据文件本身是按主键聚集的,所以InnoDB要求表必须有主键,如果没有显示指定主键,InnoDB会自动选择可以唯一标识数据记录的列做主键;如果不存在,则表生成一个隐含字段作为主键(字段为6个字节,长整形)。

索引总结

索引优化策略

MySQL的优化主要有结构优化和查询优化。索引策略属于结构优化的范畴。下面使用Mysql官方提供的employees数据库示例来演示索引策略。

employees数据库安装:

数据下载:https://launchpad.net/test-db/employees-db-1/1.0.6
参考网页:http://dev.mysql.com/doc/employee/en/employees-installation.html
Mysql5.7版本可能会报错,参考网页:http://stackoverflow.com/questions/36322903/error-1193-when-following-employees-database-install-tutorial-with-mysql-5-7-1

图6
最左前缀匹配原理

要想高效的使用索引,首先需要知道查询操作怎么使用索引,目前常用的是两种索引:单列索引,组合索引(多列顺序组合)。

以employees数据库中的titles为例,索引如下图所示:

从图7中可以看出,titles存在两个索引,第一个是<emp_no,title,from_date>元组的组合索引(主索引);第二个是单列的辅助索引(emp_no)。下面通过语句看索引使用的几种情况:

但是这只用到了emp_no这个字段的索引,因为缺少中间的title字段,我们使用distinct,发现title只有固定几个值,因此,可以在sql中补全title来进行全列匹配索引。

图12
索引选择性

既然索引可以加快查询速度,是不是意味着只要查询语句需要,就可以建上索引?答案是否定的。因为索引虽然可以加快查询的速度,但索引本身会占用存储空间,并且数据库进行DML操作时会调整索引的架构,同时mysql也会消耗资源来维护索引,因此索引并不是越多越好。

一般有两种情况不建议添加索引:

我们再看一个示例:employees.employees表中的索引如下图所示,从图中看出employees表中只有一个主键索引,如果我们需要按照名字(first_name,last_name)来查询数据,在数据量较大的情况下速度会很慢,因此我们需要建立名字查询的索引。


图14

首先看下按名字索引的选择性:


图15
从图15中可以看出,如果单纯使用first_name字段进行索引,重复率太高,索引的选择性非常低,因此使用first_name和last_name的联合索引,但是这两个联合索引是不是最好的?答案是否定的,因为这两个字段是啥字符串型,如果使用联合索引,则索引的数据结构会变得比较庞大,占用大量的磁盘空间,导致频繁的磁盘I/O,反而影响数据库的性能。因此可以在索引上做下优化:
图16
当只取last_name前4位时(前缀索引),索引的选择性已然达到了0.9以上,因此是一个性能不错的索引,此外该索引的磁盘空间要比全列索引占用量小,综合性能会更好。前缀索引兼顾了速度与索引大小,但其缺点是不能用于order by和group by操作。

拓展:

两个问题的答案都在于使用B+树做为索引,可以减少索引的磁盘I/O性能。从前面我们可知,索引是一个数据结构,存放在磁盘中,当需要使用索引时,从磁盘读取到内存中,然后在内存中进行索引查询数据。因此索引的查找过程要产生磁盘I/O消耗,相对于内存存取,I/O的速度要比内存低好几个数量级,所以一个索引的优劣性能可以通过索引文件的磁盘I/O消耗来衡量,如果磁盘I/O消耗越低,这就是一个越高效的索引。(所以B+优于红黑树和B-树的点就在于,B+树的数据结构有更小的磁盘I/O消耗)。下面详细介绍:

B+树磁盘索引过程:


图18

B+树更适合操作系统文件和数据库文件的索引。

上一篇下一篇

猜你喜欢

热点阅读