我的问题是关于碎片环境的ID生成。我正在执行与instagram did相同的步骤来生成唯一的id。我对MySQL中这个id生成的实现有一些问题。
这是如何生成ID的(这是一个PGQL存储过程)
CREATE OR REPLACE FUNCTION insta5.next_id(OUT result bigint) AS $$
DECLARE
our_epoch bigint := 1314220021721;
seq_id bigint;
now_millis bigint;
shard_id int := 5;
BEGIN
SELECT nextval('insta5.table_id_seq') %% 1024 INTO seq_id;
SELECT FLOOR(EXTRACT(EPOCH FROM clock_timestamp()) * 1000) INTO now_millis;
result := (now_millis - our_epoch) << 23;
result := result | (shard_id << 10);
result := result | (seq_id);
END;
$$ LANGUAGE PLPGSQL;
CREATE TABLE insta5.our_table (
"id" bigint NOT NULL DEFAULT insta5.next_id(),
...rest of table schema...
)
我的问题是如何在MySQL(等价代码)中做到这一点。应该从查询中调用此存储过程以获取下一个id。
我的另一个问题是关于查询碎片。据我所知,它们使用映射到实际服务器的逻辑碎片。如果他们决定将一个逻辑碎片映射到一个新服务器,这意味着他们必须同时查询两个服务器来聚合结果,因为在他们为同一个逻辑碎片分配一个新服务器之前,一些数据被添加到旧服务器。我只想知道是否有更好的方法来使用逻辑碎片,并且可以选择查询数据所在的单个服务器,而不是查询属于该逻辑碎片的所有服务器?
谢谢。
最佳答案
从代码的外观上看,您只需要复制序列,您可以在MySQL中使用AUTO_INCREMENT创建表并使用它生成标识号。