【问题标题】:MySQL: How are bin() columns indexed?MySQL:如何对 bin() 列进行索引?
【发布时间】:2022-09-27 11:35:57
【问题描述】:

低级 MySQL 问题:我们将 UUID 作为 bin(16) 存储在数据库中,并将它们用作主键。我们正在将存储的 UUID 更改为基于时间的。我们希望将聚集索引插入优化为仅追加,但这只有在我们确定 MySQL 如何将值添加到 b-tree 时才有效。有谁知道用于 bin 类型的 MySQL b-tree 是否首先使用最低或最高有效位,然后分别从右到左或从左到右?

    标签: mysql


    【解决方案1】:

    二进制字符串类型与其他字符串类型一样,只是它们没有字符集。也就是说,字节被视为文字字节值,没有编码。否则,它们就像字符串一样排序:从左到右。

    尝试一个实验来测试这个:

    create table mytable (id int primary key, b binary(16), key(b));
        
    insert into mytable values 
    (1, unhex('BBBBBBBBBBBBBBBB7777777777777777')), 
    (2, unhex('7777777777777777BBBBBBBBBBBBBBBB'))
        
    mysql> select id, hex(b) from mytable order by b;
    +----+----------------------------------+
    | id | hex(b)                           |
    +----+----------------------------------+
    |  2 | 7777777777777777BBBBBBBBBBBBBBBB |
    |  1 | BBBBBBBBBBBBBBBB7777777777777777 |
    +----+----------------------------------+
    

    如果字符串按最低有效位排序,则顺序相反。

    我使用 EXPLAIN 来证明此查询使用列 b 上的索引:

    explain select id, hex(b) from mytable order by b;
    +----+-------------+---------+------------+-------+---------------+------+---------+------+------+----------+-------------+
    | id | select_type | table   | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
    +----+-------------+---------+------------+-------+---------------+------+---------+------+------+----------+-------------+
    |  1 | SIMPLE      | mytable | NULL       | index | NULL          | b    | 17      | NULL |    2 |   100.00 | Using index |
    +----+-------------+---------+------------+-------+---------------+------+---------+------+------+----------+-------------+
    

    【讨论】:

    • 嗨@BillKarwin 首先,很好的答案!我有个问题。为什么查询计划中可能的键列显示为 NULL,即使它找到并使用了您定义的索引?
    • type: index 指示索引扫描时,这是典型的。它没有使用任何索引来限制行,而是从索引中读取以获取索引顺序的行。
    • 知道了!谢谢你的明确回答。我很感激。
    【解决方案2】:

    是的,可以将 Type 1 UUID 转换为BINARY(16),以按时间顺序进行“琐碎”索引。

    Pre-8.0,见我的 UUID 博客:UUIDs

    8.0:查看 uuid 函数;它们的作用与我的博客中提到的基本相同

    MariaDB 10.7 有一个 UUID 数据类型;无需添加函数调用。但他们以不同的方式重新排列这些位。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多