MyISAM,INODB存储引擎索引结构

MyISAM主键索引
MyISAM使用B+树作为索引结构,叶节点的data域存放数据记录的地址,下面是MyISAM主键索引的原理图:
MyISAM,INODB存储引擎索引结构_第1张图片
MyISAM辅助索引
在MyISAM中,主索引和辅助索引在结构上没有区别,只是主索引要求关键字key的值是唯一的,而辅助索引允许key值重复。结构图如下:
MyISAM,INODB存储引擎索引结构_第2张图片
根据上面两个图,首先按照B+树搜索算法搜索引擎,如果指定的key值存在,则取出key值对应的data值,按照data值,一data值为地址读取数据。

可以看到MyISAM存储引擎,索引结构叶子节点存储关键字和数据记录的地址,也就是说索引关键字和数据并没有存放在一起体现在磁盘上。就是索引在一个文件存储,数据在另一个文件存储,例如一个user表,会在磁盘上创建3个文件user.frm(表结构文件),user.MYD(表数据文件),user.MYI(表索引文件)
因此MyISAM的索引结构称为非聚簇索引

InnoDB主键索引
InnoDB存储引擎的主键索引,叶子节点中关键字和数据时存放在一起的,结构如下:
MyISAM,INODB存储引擎索引结构_第3张图片
InnoDB辅助索引
InnoDB辅助索引叶子节点存放的是关键字和主键,结构如下:
MyISAM,INODB存储引擎索引结构_第4张图片
辅助索引的B+树,叶子节点存储关键字和对应的主键,先根据关键字找到对应的主键,再去主键索引上查询数据。
从索引树上可以看出,InnoDB的索引关键字和数据是一起存放的,体现在磁盘存储上。例如创建一个user表,在磁盘上只创建两个文件,user.frm(表的结构文件)user.ibd(索引和数据文件)
InnoDB索引结构,叶子节点包含了完整的数据记录,这种索引叫做聚簇索引因为InnoDB的数据文件本身要按主键聚集,所以要求InnoDB要求表必须有主键(MyISAM可以没有),如果没有显示指定,则Mysql系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,Mysql自动为InnoDB生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

索引设计原则
由于索引也是需要存储成索引文件的,因此对于索引的使用,也涉及大量的磁盘I/O操作,如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL查询效率,适得其反,因此掌握索引的执行过程和实现原理,非常重要
1.给区分度高的字段创建索引
2.给经常需要排序,分组和多表联合操作的字段创建索引
3.给常作为查询条件的字段创建索引
4.索引的数目不宜过多
5.使用数据量少的索引(如前缀索引,主要针对字符串类型,字符串类型尽量创建前缀索引)
6.对于多列索引,优先指定最左边的列集
7.删除不再使用或者很少使用的索引

你可能感兴趣的:(Mysql)