• 索引(帮助mysql高效获取数据的一种排好序的数据结构)
      • 底层采用b+tree
        • 每个结点占内存16kb
        • 只有叶子结点存储数据的内存地址 (或者其他的数据行)
      • image.png
    • 因为B+Tree的第一层和第二层一般都是索引:
      • 理论上是3次IO才可以查到数据
      • 时机项目中在启动的时候会把第一层和第二层的索引加载到内存,
      • 所以一般执行要一次io就可以查到对应的数据
    • B + Tree结构 和B -Tree的区别
      • b树的非叶子节点存储了数据+索引+一下个区间的地址,而b+树的非叶子结点不存数据,只存索引(冗余)+下一个磁盘区间的地址 这样可以大大的减少树的高度,从而减少磁盘的IO
      • b树的叶子结点之间没有维护指针,而b+树叶子结点之间维护了一个双向链表(指针),大大的提高了范围查询的效率
    • 索引存储引擎类型
      • innoDB:主键(聚集索引),非主键索引(非聚集索引)
        • xxx(表名).frm:存储表结构
        • xxx.ibd:存储数据和索引
        • innoDB 主键(聚集索引)索引的存储方式: 叶子节点 保存了索引所在行的其他 列的数据 :就是每一个主键保存了一行数据,而不是地址
        • 非主键索引(非聚集索引)叶子节点存储的是主键索引值,所以innoDB引擎 必须维护一个主键(推荐自增) 自增的查询效率会比较快,不是自增插入的时候需要更多判断处理条件,如果我们创建表的时候没有创建主键,数据库就会去找没有出现重复行的一列作为主键索引,如果没有找到这样的列,数据库会在底层自己维护一个隐藏的自增主键索引,
      • myisam(非聚集索引)
        • 表的数据在底层使用:3个文件存储
          • xxx.frm:存储表结构
          • xxx.MYD :存储数据
          • xxx.MYI:存储索引
          • 叶子结点存储的是数据行在磁盘的地址
        • image.png
      • hash结构
        • 对索引的key进行一次hash计算就可以定位到数据存储的位置
        • 很多时候hash索引比B+树索引跟高效
        • 仅仅能满足=和in 查询 不支持范围查询
        • hash冲突问题
        • image.png
      • 联合索引
        • 如果设置多个字段作为联合索引,查询的时候不可以跳过第一个字段 查询,这样是不能走索引的,因为索引是有序的数据结构,联合索引的排序是 :先按第一个字段排序,如果相同,在对比第二个字段,乳沟第二个字段也相同,则对比第三个字段,:所以:联合索引除去第一个字段,其他字段都是无序的,单独使用或者跳过第一字段使用,是不走索引的: (最左前缀原则)
        • image.png