【发布时间】:2022-09-27 11:35:57
【问题描述】:
低级 MySQL 问题:我们将 UUID 作为 bin(16) 存储在数据库中,并将它们用作主键。我们正在将存储的 UUID 更改为基于时间的。我们希望将聚集索引插入优化为仅追加,但这只有在我们确定 MySQL 如何将值添加到 b-tree 时才有效。有谁知道用于 bin 类型的 MySQL b-tree 是否首先使用最低或最高有效位,然后分别从右到左或从左到右?
标签: mysql
低级 MySQL 问题:我们将 UUID 作为 bin(16) 存储在数据库中,并将它们用作主键。我们正在将存储的 UUID 更改为基于时间的。我们希望将聚集索引插入优化为仅追加,但这只有在我们确定 MySQL 如何将值添加到 b-tree 时才有效。有谁知道用于 bin 类型的 MySQL b-tree 是否首先使用最低或最高有效位,然后分别从右到左或从左到右?
标签: mysql
二进制字符串类型与其他字符串类型一样,只是它们没有字符集。也就是说,字节被视为文字字节值,没有编码。否则,它们就像字符串一样排序:从左到右。
尝试一个实验来测试这个:
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 |
+----+-------------+---------+------------+-------+---------------+------+---------+------+------+----------+-------------+
【讨论】:
type: index 指示索引扫描时,这是典型的。它没有使用任何索引来限制行,而是从索引中读取以获取索引顺序的行。
是的,可以将 Type 1 UUID 转换为BINARY(16),以按时间顺序进行“琐碎”索引。
Pre-8.0,见我的 UUID 博客:UUIDs
8.0:查看 uuid 函数;它们的作用与我的博客中提到的基本相同
MariaDB 10.7 有一个 UUID 数据类型;无需添加函数调用。但他们以不同的方式重新排列这些位。
【讨论】: