› 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 · Jul 31, 2020 · 4908 views
    This topic created in 2287 days ago, the information mentioned may be changed or developed.

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

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

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

    11 replies  •  2022-03-10 10:05:02 +08:00
    yyyyfan
    yyyyfan
    Jul 31, 2020 via Android
    1
    mysql 数据库是视 null 值小于任何的一个非 null 值
    JasonLaw
    JasonLaw
    OP
    Jul 31, 2020
    2
    @yyyyfan #1 有没有官方文档说明这个东西呢?我并没有找到相关的内容。
    iConnect
    iConnect
    Jul 31, 2020 via Android
    3
    MySQL 官方早就解决 Null 索引的问题了,具体哪个版本开始需要去看下文档
    JasonLaw
    JasonLaw
    OP
    Jul 31, 2020
    4
    @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
    iConnect
    Jul 31, 2020 via Android
    5
    @JasonLaw 只有两种方案,原始的就是继承底层空指针,或者存的值就是 0 。(没有去验证过具体版本的实现)
    zhangysh1995
    zhangysh1995
    Jul 31, 2020
    6
    应该需要看源代码了,参考 https://dev.mysql.com/doc/internals/en/files-in-innodb-sources.html 里面 \btr (B-TREE) 一节
    zhangysh1995
    zhangysh1995
    Jul 31, 2020
    7
    我大概看了一下 optimizer 部分 NULL 的存储,是从内存 load 进来的,也就是说底层存储引擎存了 NULL 这个值。https://dev.mysql.com/doc/dev/mysql-server/latest/classField__null.html
    wangyzj
    wangyzj
    Jul 31, 2020
    8
    这是一个好问题
    空值会索引吗?
    louettagfh
    louettagfh
    Aug 3, 2020
    9
    NULL 就是一个标志位
    zhangwugui
    zhangwugui
    Aug 6, 2020
    10
    是个好问题; 我也有相同的疑惑;
    null 在 mysql 行存储中,是有标识位的概念的;
    但 null 在索引中如何存储的,我好像也没找到对应的文档。
    Jericho112
    Jericho112
    Mar 10, 2022
    11
    索引的最左侧,可以看下这篇文章: https://cloud.tencent.com/developer/article/1658064
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1293 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 21:13 · PVG 05:13 · LAX 13:13 · JFK 16:13
    ♥ Do have faith in what you're doing.