首页 > 其他分享 >InnoDB的唯一二级索引非叶子节点存储了主键的值,这是为什么呢?

InnoDB的唯一二级索引非叶子节点存储了主键的值,这是为什么呢?

时间:2023-03-15 21:34:47浏览次数:83  
标签:二级 INT page 索引 InnoDB 节点 NULL 主键

官方其实对这个问题有过详细的解答,可以看这里的链接:https://bugs.mysql.com/bug.php?id=68546
总结下来主要是下面两点:

  1. 因为在MySQL语义中,NULL != NULL为false, 所以,唯一二级索引可以为NULL,也就导致这种情况下可能会出现重复值,比如:

    CREATE TABLE t1 (a INT, b INT, c INT, d INT,
     PRIMARY KEY(a,b,c),
     UNIQUE KEY (a,d)) ENGINE=InnoDB;
    INSERT INTO t1 VALUES(1,1,1,NULL),(1,1,2,NULL),...,(1,1,99999,NULL);
    

    是合法的, PRIMARY KEY是不允许为NULL的。

    这个时候,假设btr_pcur_t::m_old_rec指向 (1,NULL,1,330)btr_pcur_restore_position函数就可以简单的解引用该节点,直接定位到所需的页面上, 但是,如果二级索引的叶子节点只存储(a,d,page_no),那么,就需要扫描所有的叶子节点挨个去查找目标page(因为有很多重复的),这样子性能会非常低下。

  2. 那么,是不是意味着这种优化就适用于唯一非NULL二级索引呢?其实也不是的,在MySQL中,支持MVCC的方式是通过undo来实现的,这个时候,如果有个事务update/delete了某一个tuple,由于MySQL是实现的delete-marker,后续由purge进行真正的删除动作,在二级索引(1,1,page_no)里,将会存储着多个page_nobtr_pcur_restore_position就得挨个进行遍历,性能同样也是非常低下的。

标签:二级,INT,page,索引,InnoDB,节点,NULL,主键
From: https://www.cnblogs.com/seancheer/p/17220139.html

相关文章

  • MySQL学习(四)---->InnoDB数据页结构
    页是InnoDB管理存储空间的基本单位,一个页的大小一般是16KB。InnoDB为了不同的目的而设计了许多种不同类型的页,比如存放表空间头部信息的页,存放InsertBuffer信息的页,......
  • enumerate()—返回遍历对象的索引
    语法格式enumerate(iterable, start=0)iterable:支持支持迭代的对象,包括字符串、列表、数组和字典等start--下标起始位置的值,默认为0代码示例str1="abcd"fori,......
  • Mysql数据库未添加索引引发的生产事故
    最近开发的新功能主要是首页的红点提示功能,某个用户登录系统app,然后进入某一个功能模块,在该功能下面有很多地方可以操作,新功能就是根据用户信息查询当月是否存在新的......
  • ES 单索引大表拆分
    使用reindex命令进行拆分,具体流程如下://1.查询原表,拿到表结构GETbig_data/_search//2.生成新表,插入数据POSTsm_data_1/sm_data/1{数据结构}//3.调整刷新策略P......
  • 索引原理与优化
    下面这条SQL,你怎么通过索引来提高查询效率呢?select*fromorderwherestatus=1 orderbycreate_timeasc更优的方式是建立一个status和create_time组合索引,这......
  • 基于哈希的索引和基于树的索引的区别
    1、hash索引仅满足“=”、“IN”和“<=>”查询,不能使用范围查询因为hash索引比较的是经常hash运算之后的hash值,因此只能进行等值的过滤,不能基于范围的查找,因为经过hash算......
  • 16.MySQL数据库之mysql-5.7 show engine innodb status 详解,常用的地方一、死锁分析 
     一、show engine innodb status 简介:show engine innodb status 是mysql提供的一个用于查看innodb引擎时间信息的工具,就目前来说有两处比较常用的地......
  • InnoDB与 MyISAM 的区别
    MyISAMInnoDB事务X√行锁X√外键X√全文搜索√X表空间的大小较小较大,约为MyISAM的2倍MyISAMMyISAM是MySQL5.5版本之前的默认......
  • 外贸建站如何提高搜索引擎排名,吸引更多潜在客户?
    在如今全球贸易日益繁荣的背景下,越来越多的企业开始重视外贸建站,并寻求提高搜索引擎排名以吸引更多潜在客户。那么,如何才能有效地提高外贸网站的搜索引擎排名呢?本文将为您详......
  • oracle建表语句,添加主键、索引、注释,插入数据,添加序列
    createtableFND_COMPANIES_42624(COMPANY_IDnumber(3)primarykey,--公司IDnumber序列COMPANY_CODEVARCHAR2(30)notnull,--公司......