MySQL の index において、 null はどこに配置される？


innodb にて、 gap/next key lock が原因と思われる、他のトランザクションの commit 待ちを目撃しました。ふと、
MySQL/innodb のインデックスにおいて、 null はどこに配置されるのだろう、と思いました。

# 質問

  * MySQL/innodb の index において、 null はどこに配置されますか？



[code]

    CREATE TABLE `test2` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `val` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `val_idx` (`val`)
    );
    
    INSERT INTO `test2` (`id`,`val`) VALUES (1,2);
    INSERT INTO `test2` (`id`,`val`) VALUES (2,NULL);
    
[/code]

上記のようなテーブルを作成し、 `select * from test2 order by val` を実行したところ、

[code]

    +----+------+
    | id | val  |
    +----+------+
    |  2 | NULL |
    |  1 |    2 |
    +----+------+
    
[/code]

となったので、

  * `NULL` は、インデックス上すべての値の手前に挿入される

と理解しました。



[code]

    CREATE TABLE `test2` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `val` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `val_idx` (`val`)
    );
    
    INSERT INTO `test2` (`id`,`val`) VALUES (1,2);
    INSERT INTO `test2` (`id`,`val`) VALUES (2,NULL);
    
[/code]

上記のようなテーブルを作成し、 `select * from test2 order by val` を実行したところ、

[code]

    +----+------+
    | id | val  |
    +----+------+
    |  2 | NULL |
    |  1 |    2 |
    +----+------+
    
[/code]

となったので、

  * `NULL` は、インデックス上すべての値の手前に挿入される

と理解しました。

