正如我们所知,在计算机上运行一个任务,影响其性能的主要因素包括内存的大小,cpu以及磁盘的速度。而对于索引来说,它是一种数据的存储方式,而与它相关的就是磁盘的读取速度了。对于磁盘来说,顺序的读取肯定比随机的读取数据要快。即便数据的物理存储是没顺序的,但是索引是有顺序的。我们可以通过索引的顺序查找,来找到对应的物理数据页。另外,我们读取数据的时候,尽量读取有效数据,减少无效数据的读取。例如对于一行有十条记录的表,我们只需要读出其中某列或者某几列的数据,那么我们就可以只在我们需要的列上建立索引,只读取我们需要的有效数据而不需要每次都读出所有列的数据。因此,Innodb的索引采用了B+树的存储结构来管理。其特点:
① 叶子节点存储所有的数据,内节点只存储键值;
② 由于键值既在叶子节点上也在内节点上,需要一定的存储空间,空间换性能;
③ 查询的复杂度和B+树的层数有关,层数越少,性能越好;
④ 层数和每个数据页储存多少条数据有关,也就是和key_length有关。所以B+树不适合存储长的索引列。
Innodb索引分为聚簇索引(clustered index)和普通索引(secondary index):
聚簇索引:每张表必须有且只有一个聚簇索引来存放所有的数据。它的叶子节点存放了整张表的所有数据行。聚簇索引第一会选择我们建表时明确定义的主键列;如果没定义主键列,第二会选择第一个非空的唯一索引列;如果前二者都没有,Innodb会选择隐藏的Rowid(实例级别,6byte)做为聚簇索引。