MySQL

索引

MySQL索引使⽤的数据结构主要有BTree索引 和 哈希索引 ,哈希索引来说,底层的数据结构就是哈希表

  • 因此在绝⼤多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快
  • 其余⼤部分场景,建议选择BTree索引

    MySQL的BTree索引使⽤的是B树中的B+Tree,但对于主要的两种存储引擎的实现⽅式是不同的。

  • MyISAM: 索引⽂件和数据⽂件是分离的,B+Tree叶节点的data域存放的是数据记录的地址。 在索引检索的时候,⾸先按照 B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其 data 域的值,然后以 data 域的 值为地址读取相应的数据记录。这被称为“⾮聚簇索引”

  • InnoDB : 其数据⽂件本身就是索引⽂件,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据⽂件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。⽽其余的索引都作为辅助索引 , 辅助索引的data域存储相应记录主键的值⽽不是地址,这也是和MyISAM不同的地⽅, 在根据主索引搜索时,直接找到key所 在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再⾛⼀遍主索引。 因此,在设计表的时候,不建议使⽤过⻓的字段作为主键,也不建议使⽤⾮单调的字段 作为主键,这样会造成主索引频繁分裂