V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
JasonLaw
V2EX  ›  MySQL

MySQL InnoDB 的索引将 null 存储在哪里?

  •  1
     
  •   JasonLaw · 2020-07-31 09:09:13 +08:00 · 3716 次点击
    这是一个创建于 1606 天前的主题,其中的信息可能已经有所发展或是发生改变。

    MySQL 中 IS NULL 、IS NOT NULL 、!=不能用索引?胡扯! - 掘金中,它说:

    对于二级索引来说,索引列的值可能为 NULL 。那对于索引列值为 NULL 的二级索引记录来说,它们被放在 B+树的哪里呢?答案是:放在 B+树的最左边。

    但是我并没有找到相关的官方资料说明这个东西,MySQL InnoDB 真的是如文章所说的那样存储 null 的吗?

    11 条回复    2022-03-10 10:05:02 +08:00
    yyyyfan
        1
    yyyyfan  
       2020-07-31 09:18:40 +08:00 via Android
    mysql 数据库是视 null 值小于任何的一个非 null 值
    JasonLaw
        2
    JasonLaw  
    OP
       2020-07-31 09:28:35 +08:00
    @yyyyfan #1 有没有官方文档说明这个东西呢?我并没有找到相关的内容。
    iConnect
        3
    iConnect  
       2020-07-31 09:30:50 +08:00 via Android
    MySQL 官方早就解决 Null 索引的问题了,具体哪个版本开始需要去看下文档
    JasonLaw
        4
    JasonLaw  
    OP
       2020-07-31 09:47:20 +08:00
    @iConnect #3 虽然 https://dev.mysql.com/doc/refman/8.0/en/is-null-optimization.html 说了“MySQL can perform the same optimization on col_name IS NULL that it can use for col_name = constant_value. For example, MySQL can use indexes and ranges to search for NULL with IS NULL.”,但是我更想知道“索引是怎么存储 null”的官方文档,可惜我没有找到。
    iConnect
        5
    iConnect  
       2020-07-31 09:56:38 +08:00 via Android
    @JasonLaw 只有两种方案,原始的就是继承底层空指针,或者存的值就是 0 。(没有去验证过具体版本的实现)
    zhangysh1995
        6
    zhangysh1995  
       2020-07-31 13:07:42 +08:00
    应该需要看源代码了,参考 https://dev.mysql.com/doc/internals/en/files-in-innodb-sources.html 里面 \btr (B-TREE) 一节
    zhangysh1995
        7
    zhangysh1995  
       2020-07-31 13:08:56 +08:00
    我大概看了一下 optimizer 部分 NULL 的存储,是从内存 load 进来的,也就是说底层存储引擎存了 NULL 这个值。https://dev.mysql.com/doc/dev/mysql-server/latest/classField__null.html
    wangyzj
        8
    wangyzj  
       2020-07-31 18:15:02 +08:00
    这是一个好问题
    空值会索引吗?
    louettagfh
        9
    louettagfh  
       2020-08-03 00:19:58 +08:00
    NULL 就是一个标志位
    zhangwugui
        10
    zhangwugui  
       2020-08-06 11:57:34 +08:00
    是个好问题; 我也有相同的疑惑;
    null 在 mysql 行存储中,是有标识位的概念的;
    但 null 在索引中如何存储的,我好像也没找到对应的文档。
    Jericho112
        11
    Jericho112  
       2022-03-10 10:05:02 +08:00
    索引的最左侧,可以看下这篇文章: https://cloud.tencent.com/developer/article/1658064
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1374 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 70ms · UTC 17:18 · PVG 01:18 · LAX 09:18 · JFK 12:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.