索引 上
哈希表:一种以键-值(key-value)存储数据的结构。当多个key经过哈希换算,出现同一个值的情况时, 需要拉出一个链表来解决该情况。但是哈希查找的值并不是有序存储的,所以当采用哈希索引查找时,不适合做区间查询,只适用于只有等值查询的场景。
有序数组:在等值查询和范围查询场景中的性能十分优秀。该索引结构支持范围查询,当只看查询效率,该结构很好,但当数据需要更新的时候 ,成本太高。所以有序数组只适用于静态存储引擎。
二叉搜索树:索引不止存在与内存中,还要写在磁盘中,当采用平衡二叉树,树越高,查询次数越多,效率很低。为了尽量少的读磁盘,就必须让查询过程访问尽量少的数据块。那么就需要使用N叉树,以InnoDB为例,N差不多是1200。
索引时存储引擎层实现的,所以没有统一的索引标准,即不同存储引擎的索引的工作方式时不一样的。
在InnoDB中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表成为索引组织表,InnoDB使用了B+树索引结构,所以数据都是存储在B+树中的。
此处有一个主键列为ID的表,表中有字段k,并且在k上有索引。
mysql> create table T(
id int primary key,
k int not null,
name varchar(16),
index (k))engine=InnoDB;
索引分为主键索引和非主键索引。
主键索引的叶子节点存的是整行数据,在InnoDB中,主键索引也叫聚簇索引。
非主键索引的叶子节点内容时主键的值,在InnoDB中,非主键索引也被成为耳机索引。
当语句时 select * from T where ID=500
,即主键查询方式,则只需要搜索ID这颗B+树。
如果语句时select * from T where k=5
,即普通索引查询方式,则需要先搜索k索引树,得到ID的值为500,再到ID索引树搜索依次,这个过程成为回表。
也就是说,基于非主键索引的查询需要多扫描一棵索引树,因此,我们在应用中应该尽量使用主键查询。