sql >> Databasteknik >  >> RDS >> Mysql

Sharding och ID-generering som instagram

Detta är postgres motsvarighet

Ange TABLE_SCHEMA och MASKTABLE nedan

Jag skapar en MASKTABLE med en dummy första post

DELIMITER $$
CREATE OR REPLACE FUNCTION generate_next_id() RETURNS bigint NOT DETERMINISTIC
MAIN: BEGIN
DECLARE our_epoch bigint;
DECLARE seq_id bigint;
DECLARE now_millis bigint;
DECLARE shard_id int;
DECLARE param bigint ;
SET @our_epoch = 1568873367231;
SET @shard_id = 1;
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA = "SCHEMANAME" AND TABLE_NAME = "MASKTABLE" into @seq_id;
SELECT FLOOR(UNIX_TIMESTAMP()) * 1000 into @now_millis;
SELECT (@now_millis - @our_epoch) << 23 into @param;
SELECT @param | (@shard_id <<10) into @param; 
select @param | (@seq_id) into @param; 
RETURN @param;
END MAIN;$$ 
DELIMITER ;

Användning

select generate_next_id()

Du kan använda den i trigger som

CREATE TRIGGER trigger_name
BEFORE INSERT ON TableName 
FOR EACH ROW
SET new.id = generate_next_id();


  1. JDBC Batch insert undantagshantering

  2. Mycket enkel AVG() aggregeringsfråga på MySQL-servern tar löjligt lång tid

  3. Postgresql SQL GROUP BY tidsintervall med godtycklig noggrannhet (ned till millisekunder)

  4. SQL Server CASE-uttryck