zoukankan      html  css  js  c++  java
  • 聚集索引和非聚集索引

    聚集索引和非聚集索引概念

    ​ 什么是聚集索引?

    ​ 众所周知,innodb中索引的组织形式是B+树,非叶子节点存key,叶子节点存key+data,叶子节点之间用指针联通。

    ​ 聚集索引则在data存放是数据页

    ​ 什么是非聚集索引?

    ​ 非聚集索引和聚集索引一样, 同样是采用平衡树作为索引的数据结构。索引树结构中各节点的值来自于表中的索引字段, 假如给user表的name字段加上索引 , 那么索引就是由name字段中的值构成。data中存放的是主键的值,得到主键后还需要在聚集索引上再查询一次

    索引和表的关系

    ​ innodb存储引擎表是索引组织表,这代表着表数据是按主键顺序存放。而每张表都有个主键(没设主键会隐藏生成一个),主键即为聚集索引。那么换句话说,表中数据存储实际上采用的是B+树存储。

    主键和聚集索引的关系

    ​ 如果设置主键那么主键为聚集索引

    ​ 如果没有设置,第一个非空的唯一索引则为聚集索引

    ​ 如果再没有,自动隐藏创建个主键当做聚集索引

    非聚集索引

    ​ 除了聚集索引剩下都是非聚集,聚集索引一张表只有一个,非聚集有很多。

    ​ 非数据索引也是一颗数,在查询的时候先通过非聚集索引数找到主键id,在通过主键id在聚集索引树上找到对应数据

    联合索引

    ​ 创建个索引(A,B,C)其实会创建三个索引,A,AB,ABC,很多资料上说最左前缀法则就能使用上索引

    ​ 如果where C B A则不能,其实不然,mysql当做有个优化器,可以调整条件顺序,只要有开头就能使用上索引,即这个场景下只要有A就能使用索引。

    ​ 如果中间断了 即(C,A)也是可以使用索引,不过有个extra查询消耗

    ​ 不信可自行explain

    覆盖索引

    ​ 因为非聚集索引需要查询两次,但是有种情况是只需要一次的,那就是索引即是返回数据

    ​ 如果定义非聚集索引(A,B)

    ​ 查询的时候select B from tabel where A = 1;

    ​ 那么在B+树中的叶子节点中的key已经存放了A,B的数据,那么这样是可以直接返回的,无需找去查询聚集索引树。

  • 相关阅读:
    屌丝的出路:拼命工作!
    Collections.sort自定义排序的使用方法
    oracle 导入/导出遇到的 问题总结
    JDBC更新10W级以上数据性能优化
    中国特色程序员美好生活出路
    正则表达式的一些基础语法
    Java常用容器类学习总结
    从 ASP.NET 服务器控件插入客户端脚本(转自MSDN)
    ASP.NET Web Page应用深入探讨(强烈建议开发web的人学习)
    剖析 .Net 下的数据访问层技术(转)
  • 原文地址:https://www.cnblogs.com/bushishucai/p/11289558.html
Copyright © 2011-2022 走看看