MySQL InnoDB 的索引将 null 存储在哪里? - V2EX
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 4205 次点击
    这是一个创建于 1968 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 = contant_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     Solana     2648 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 13:15 PVG 21:15 LAX 05:15 JFK 08:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86