我们将MySQL与InnoDB存储引擎和事务一起大量使用,并且遇到了一个问题:我们需要一种很好的方法来在MySQL中模拟Oracle的SEQUENCE。要求是:-并发支持- 事务安全-最大性能(意味着最小化锁和死锁)
我们不在乎是否不会使用某些值,即顺序上的间隔是可以的。有一个简单的方法来存档,即通过创建一个带有计数器的单独的InnoDB表,但这意味着它将参与事务并引入锁和等待。我正在考虑尝试使用具有手动锁,其他任何想法或最佳做法的MyISAM表?
如果自动增量不足以满足您的需求,则可以使用 n个 命名序列创建原子序列机制,如下所示:
创建一个表来存储序列:
CREATE TABLE sequence ( seq_name varchar(20) unique not null, seq_current unsigned int not null );
假设您在表中有一行“ foo”,则可以自动获取下一个序列ID,如下所示:
UPDATE sequence SET seq_current = (@next := seq_current + 1) WHERE seq_name = 'foo'; SELECT @next;
无需锁。这两个语句都需要在同一会话中执行,以便在发生选择时实际定义局部变量@next。