zoukankan      html  css  js  c++  java
  • mysql聚簇索引和非聚簇索引的区别

    都是B+树的数据结构

    • 聚簇索引:将数据存储和索引放在一起、并且是按照一定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻的存放在磁盘上的。
    • 非聚簇索引:叶子节点不存储数据,存储的是数据行地址,也就是说根据索引查找到数据行的位置再去磁盘查找数据,这就有点类似一本书的目录,比如要找到第三章第一节,那就现在目录里面查找,找到对应的页码后再去对应的页码看文章。

    优势
    1、查找通过聚簇索引可以直接获取到数据,相比非聚簇索引需要第二次查询(覆盖索引除外)效率要高
    2、聚簇索引对范围查询的效率很高,因为其数据是按照大小排列的
    3、聚簇索引适合用在排序场合,非聚簇索引不适合。
    劣势
    1、维护索引代价大,特别是插入新行或者主键被更新导致要分页的时候。建议在大量插入新行后,选择负载较低的时间段,通过OPTIMIZE TABLE优化表
    2、表因为使用UUID作为主键,使数据存储稀疏,这就会出现聚簇索引有可能会比全表扫面更慢,所以建议使用int的auto_increment作为主键。
    3、如果主键比较大的话,那辅助索引将会变得更大,因为辅助索引的叶子节点存储的是主键值,过长的主键值,会导致非叶子节点占用更多的物理空间

    InnoDB中一定有主键,主键一定是聚簇索引,不手动设置,则会使用一个unique索引作为主键索引,没有unique索引,则会使用数据库内部的一个隐藏行id来当作主键索引。在聚簇索引之上创建的索引称为辅助索引,辅助索引访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引,前缀索引、唯一索引。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。

    MyISM使用的是非聚簇索引,没有聚簇索引。

  • 相关阅读:
    Vue.js(2.x)之计算属性
    Vue.js(2.x)之插值
    Chrome 打不开任意网页以及设置、扩展程序等页面解决方法
    IDEA 查看某个class的maven引用依赖&如何展示Diagram Elements
    mysql事务隔离分析
    IDEA call Hierarchy 双击跳转源码后绿色选中背景不消失问题
    记一次RocketMQ源码导入IDEA过程
    springboot+mybatis多数据源
    http调用之RestTemplate
    BlockingQueue的几个实现分析
  • 原文地址:https://www.cnblogs.com/liuzhidao/p/14798170.html
Copyright © 2011-2022 走看看