一.Btree+索引
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
假设col1是主键。InnoDB引擎下,数据文件本身就是索引文件。MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引
InnoDB表必须有主键,所以本身按主键查询就是按主索引查询。InnoDB的所有辅助索引都引用主键作为data域。例如,图11为定义在Col3上的一个辅助索引。
通过辅助索引查询,其实是查了两遍索引,先通过辅助索引找主索引,再通过主索引找数据。这可以解释很多btree索引的使用技巧:
1.联合索引最左端原则: 联合索引其实是辅助索引,从上图看,联合索引一样也是B树,最左端索引应该是在树的最上端,得通过最左端字段首先在树中进行查找,然后才能通过联合索引的其他字段在树中查找。(也没有找到联合索引的Btree+结构图);
2.覆盖索引最好:比如说联合索引有AB两个字段,查询条件是AB两个字段,直接就能用联合索引找到对应数据的主键,然后找到数据。如果查询条件是AC两个字段,则只能通过联合索引的A索引找到一部分符合条件主键信息,这部分也包含了不符合C字段的信息,然后再通过主键找到数据,筛选出符合C条件的数据。
3.不建议用长字段做主键,因为辅助索引是单独的文件,长主键意味着辅助索引文件大
4.自增主键很好,正好让BTREE+,数据顺序排列,同时主键也是顺序。
二.哈希索引
https://blog.csdn.net/olizxq/article/details/82313489