问题1:索引是什么?
答案:
索引是帮助MySQL
高效获取数据的数据结构。
解读:
索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”,满足特定查找算法。这些数据结构以某种方式指向数据, 这样就可以在这些数据结构的基础上实现 高级查找算法 。
问题2:为什么使用索引?
答案:
建立索引的目的是为了减少磁盘IO的次数,加快查询的速率。
解读:
InnoDB
是一个将表中的数据存储在磁盘上的存储引擎,即使我们关闭并重启服务器,数据还是存在。而真正处理数据的过程发生在内存中,所以需要把磁盘中的数据加载到内存中。如果处理写入和修改请求,还需要将内存中的内容刷新到磁盘上。而我们知道读写磁盘的速度非常慢,与读写内存差了几个数量级。当我们想从表中获取某些记录时,InnoDB
存储引擎需要一条一条的把记录从磁盘上读出来么?不,那样会慢死,InnoDB
采取的方式是,将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位。InnoDB
中页的大小一般为16KB
。也就是在一般情况下,一次最少从磁盘中读取16KB
的内容到内存中,一次最少把内存中的16KB
内容刷新到磁盘中。
在没有索引的情况下,由于我们不能快速的定位到记录所在的页,并从页内查找相应的记录,所以只能遍历所有的数据页,在每一页中去查找指定的记录,就要将所有的数据页从磁盘加载到内存,所以这种方式显然是超级耗时的,所以就需要一种能高效完成搜索的方法,即索引,建立索引的目的就是为了减少磁盘IO
的次数。
问题3:索引的优点?
答案:
(1)提高数据检索的效率,降低 数据库的IO成本 ,这也是创建索引最主要的原因。
(2)通过创建唯一索引,可以保证数据库表中每一行数据的唯一性 。
(3)在实现数据的参考完整性方面,可以加速表和表之间的连接 。
(4)在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间 ,降低了CPU的消耗。
答案:
(1)索引大大减少了服务器需要需要扫描的数据量;
(2)索引可以帮助服务器避免排序和临时表;
(3)索引可以将随机IO变为顺序IO;
解读:
索引可以让服务器快速的定位到表的指定位置 。最常见的B-Tree索引,按照顺序存储数据,所以mysql可以来做order by和group by操作。因为数据是有序的,所以B-Tree也就会将相关的列值都存储在一起。因为索引中存储了实际的列值,所以某些查询值使用索引就能完成全部查询。
问题4:索引的缺点?
答案:
(1)创建索引和维护索引要耗费时间 ,并且随着数据量的增加,所耗费的时间也会增加。
(2)索引需要占磁盘空间 ,除了数据表占数据空间之外,每一个索引还要占一定的物理空间, 存储在磁盘上 ,如果有大量的索引,索引文件就可能比数据文件更快达到最大文件尺寸。
(3)虽然索引大大提高了查询速度,同时却会降低更新表的速度 。当对表中的数据进行增加、删除和修改的时候,索引也要动态地维护,这样就降低了数据的维护速度。
解读:
InnoDB存储引擎默认使用的B+树索引,每建立一个索引,都要为它建立一颗B+树,每一颗B+树的每一个节点都是一个数据页,一个数据页默认会占用16KB的存储空间,而一颗很大的B+树由许多数据页组成,这将占用很大的一片存储空间。
每当对表中的数据进行增删改查操作时,都需要修改各个B+树索引,而增删改查操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行页面分裂、页面回收等操作,以维护节点和记录的顺序。