公众号merlinsea
MyISAM索引
1、MyISAM索引的底层数据结构是B+树,B+树叶子节点的data存放的是数据记录的磁盘物理地址。
2、MyISAM存储引擎的索引分为主键索引和非主键索引
主键索引:要是索引的键要唯一 。
非主键索引:索引键不要求唯一 特点:不论是主键索引还是非主键索引,都需要两次查表的过程。
InnoDB索引
1、InnoDB索引底层数据结构也是B+树,但主键索引和非主键索引中b+树的data存储内容不一样。
2、InnoDB索引分为主键索引和非主键索引:
主键索引:b+树中的叶子节点data存储的内容就是记录本身,key是主键。
非主键索引:b+树中的叶子节点data存储的内容就是记录主键,key是其他索引字段。
特点:InnoDB中的数据表本身就是一张主键索引表,数据和主键绑定在一起。非主键索引查询的时候需要进行二次查询才能查询到记录。
InnoDB主键索引【以主键primary key作为索引】
InnoDB非主键索引【以非主键列作为索引】
通过上述的描述引出的聚簇索引和非聚簇索引概念
聚簇索引:记录结果和索引键绑定在一起的索引,称之为聚簇索引,比如InnoDB的主键索引。
非聚簇索引:记录结果和索引键分开的索引,称之为非聚簇索引,比如InnoDB中的非主键索引,MyISAM中的主键索引和非主键索引。
对于sql语句 select * from test where (a between 1000 and 2000) and (b between 50000 and 100000) order by b limit 1;的索引使用过程:
假设这条sql语句在 a 和 b 字段上都建立了索引,mysql在执行的过程中,会选择一个mysql认为最合适的索引字段先将数据检索到缓存 中【类似一张中间表】,然后在根据另外一个字段继续筛选缓存中的数据,这也是为什么mysql执行的过程中只会使用一个索引的原因。这个中间表是没有建立索引的,因此也就谈不上用到第二个字段索引。