一 概述
索引是引用程序设计和开发的一个重要方面。如果索引太多,应用的性能可能会收到影响,如果所以你太少,对查询性能又会产生应影响。要找到一个合适的平衡点,这对应用的性能至关重要。
理解MySQL中的索引,最简单的方法是就是去看看一本书的"索引"部分;如果想在一本书中找到某个特定的内容,一般会先看书的"索引",找到对应的页码。
在MySQL中,存储引擎用类似的方法使用索引,首先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。
二 开发流程什么时候添加索引比较好
对于基础开发人员来说,开发人员对于数据库的工作往往停留在应用的层面,比如编写SQL语句,存储过程之类,他们甚至可能不知道索引的存在,或者认为时候让相关的DBA加上即可。
但是存在一个很重要的问题就是,DBA往往不了解业务的数据流,添加索引需要通过监控大量的SQL语句,从中找到问题。这个过程需要的时间相比于初始添加索引所需的时间多很多,并且可能会遗漏一部分索引。
当然索引并不是越多越好,有一个有意思的情况,某台MySQL服务器的磁盘使用率为100%,经过分析后发现,是由于开发人员添加了太多的索引。在删除一些不必要的索引之后,磁盘使用率马上下降为20%,因此索引的添加存在一些技巧。
三 InnoDB存储引擎索引概述
InnoDB存储引擎支持两种常见的索引,一种是B+树索引,另一种是哈希索引。InnoDB存储引擎支持的哈希索引是自适应的,InnoDB存储引擎会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引。
B+树索引就是传统意义上的索引,这时目前关系型数据库系统中最常用的,最有效的索引。
B+树索引的构造类似于二叉树,根据键值(Key Value)快速找到数据。值得注意的是B+树中的B不是代表二叉(binary),而是代表平衡,因为B+树是从最早的平衡二叉树演化而来,但是B+树不是一个二叉树。
值得注意的是B+树索引不能找到一个给定键值的具体行。B+树索引能找到的只是被查找数据行的所在的页。然后数据库通过把页读入内存,再在内存中进行查找,最后得到查找的数据。