私の質問は、シャード環境のID生成に関するものです。Instagramが一意の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を取得するためにクエリから呼び出す必要があります。
私の他の質問は、シャードのクエリに関するものです。私が理解していることから、彼らは実際のサーバーへのマップである論理シャードを使用しています。論理シャードを新しいサーバーにマップすることにした場合、これは、結果を集約するために2つのサーバーに同時にクエリを実行する必要があることを意味します。これは、同じ論理シャードに新しいサーバーを割り当てる前に、一部のデータがに追加されたためです。古いサーバー。論理シャードを使用し、その論理シャードに属しているすべてのサーバーをクエリするのではなく、データが存在する単一のサーバーをクエリするオプションがあるかどうかを知りたいだけですか?
ありがとう。