【发布时间】:2020-10-25 08:23:13
【问题描述】:
我使用 UUID 作为 MySQL 上表的 PK (BINARY(16))。哪个选项更好地将二进制文件转换为 UUID 字符串/从 UUID 字符串转换?
第一个选项是使用 MySQL 内置函数 UUID_TO_BIN 和 BIN_TO_UUID。这是最容易处理 UUID/二进制转换的方法。但我想它可能会在某些时候导致性能问题。
第二个选项是在应用层 (Node.js) 上运行转换。这样,由于 Web 服务器是水平可扩展的,因此性能不会成为大问题。但是,代码可能会有点混乱。
根据我的研究,Postgres 可以很好地处理 UUID。 MySQL 性能是否与 Postgres 一样好,无需担心性能?
每种方法的代码如下所示。
MySQL
INSERT INTO mytable SET id = UUID_TO_BIN("709fe2ce-be43-11ea-a4e2-784f439a6382", 1);
SELECT BIN_TO_UUID(id, 1) as id FROM mytable WHERE id = UUID_TO_BIN("709fe2ce-be43-11ea-a4e2-784f439a6382", 1);
应用程序(带 knex 的 Node.js)
async function add(data: DataType): Promise<void> {
await knex("mytable").insert({
...data,
id: toBinaryUUID(data.uuid),
});
}
async function find(uuid: string): Promise<DataType | undefined> {
const query = knex
.select("id")
.from("mytable")
.where("id", toBinaryUUID(uuid));
const record = await query.first();
if (record) {
record.id = fromBinaryUUID(record.id);
}
return record;
}
(我使用odo-network/binary-uuid作为转换函数。)
function fromBinaryUUID(buf: Buffer): string {
return [
buf.toString("hex", 4, 8),
buf.toString("hex", 2, 4),
buf.toString("hex", 0, 2),
buf.toString("hex", 8, 10),
buf.toString("hex", 10, 16),
].join("-");
}
function toBinaryUUID(uuid: string): Buffer {
const buf = Buffer.from(uuid.replace(/-/g, ""), "hex");
return Buffer.concat([
buf.slice(6, 8),
buf.slice(4, 6),
buf.slice(0, 4),
buf.slice(8, 16),
]);
}
【问题讨论】:
标签: mysql node.js uuid knex.js