MySQL子规模中自增ID问题的解决

MySQL子规模中自增ID问题的解决
当我们执行一次MySQL数据库表的操作,我们将不依赖MySQL的自动增量产生的唯一ID,因为数据已经被分散到多个表。 U3000 U3000

避免使用自增ip作为主密钥,给数据库表操作带来很大不便。

有一种特殊的特征---序列,在PostgreSQL,Oracle,DB2数据库。随时可以获取数据库记录数下表根据当前表的记录数和步长。然而,MySQL没有这样的序列对象。

以下方法可用于实现序列特征的唯一id:
1。通过MySQL表生成id

对于插入,即插入操作,第一件事是获得唯一ID。它需要一个表来创建id,插入一个记录并获得最后一个插入ID:

创建表(` ttlsa_com ` ` create_id `。
` ID ` bigint(20)不为空auto_increment主键
MyISAM引擎=)
也就是说,当我们需要插入数据时,我们必须从这个表中生成id值,而我的PHP代码如下所示:

< PHP
功能get_ai_id(){
为SQL =插入create_id(ID)值(' ');
$ $ > DB >查询($ SQL);
返回这个->数据库->插();
}
>

这种方法效果很好,但在高并发情况下,MySQL的auto_increment将导致整个数据库将是缓慢的。如果有一个自增字段,MySQL会保持一个自增锁。InnoDB将存储在内存计数器记录auto_increment价值。当插入新行数据时,将使用一个表锁来锁定计数器直到插入结束。如果插入行和行,没有问题,但在高度并发的情况下,它将是悲伤的。表锁会导致SQL堵塞,这将大大影响性能和max_connections价值。

innodb_autoinc_lock_mode:您可以设置3个值:0, 1, 2。

0:传统(每次产生一个表锁)

1:连续默认情况下,当我们预测行数时,我们可以使用新的方法。我们使用新方法时不能使用表锁。对于简单的插入,我们可以获得批处理锁并确保连续插入。

2:交错(不会锁定表,一个处理一个,最高并发)

MyISAM表是传统的发动机,和表锁是每一次。

2。通过使用生成的ID

功能get_next_autoincrement_waitlock($超时= 60){
$ = $超时> 0 $超时:60;

当($)-获取(串行:锁){
数+;
睡眠(1);
如果(计数10)
返回false;
}

返回true;
}

功能get_next_autoincrement($超时= 60){
检查我们是否被锁定…
如果(get_next_autoincrement_waitlock($超时)= false)
返回0;

ID = $ R美元-> incr(串行);

如果($ 1)
返回$ id;

如果为1,我们假设没有串行键…

我们需要上锁。第一
如果($ R > setnx(系列:锁),1){
$过期>(串行:锁定

从数据库中获取最大值(id)。
$id = select_db_query(选择MAX(ID)从user_posts );
或者:
选择ID由 / ID DESC LIMIT 1阶user_posts

增加
美元+ +;

redis键 / /更新
设置()串行

锁释放
$;

返回$ id;
}

得不到锁。/ / can
返回0;
}

$ R =新的Redis();
$ R ->连接(127.0.0.1

ID = get_next_autoincrement(美元);
如果($){
为SQL =插入user_posts(ID,用户信息)值($id,' $用户,' $消息)。
数据exec_db_query美元($ SQL);
}

三.队列模式

事实上,这是上述解释之一。

使用队列服务,比如redis,memcacheq等,将一定量的ID预分配一个队列,每个插入操作,从队列中获取一个ID,如果插入失败,身份再次添加到队列中,同时监测队列数,当小于阈值自动添加元素的队列。

这样你可以分配ID的计划,会带来经济效应,如QQ号码,各种漂亮的日期,价格标签,如用户ID的网站,允许UID登陆,推出各种美丽的日期,价格,扰乱普通ID后随机分配。

< PHP

公共类{

私人股本;

函数构造(){
美元-> __construct();
}

公共功能__construct(){
美元-> R =新的Redis();
美元-> R ->连接('127.0.0.1 ',6379);
}

功能set_queue_id($ IDS){
如果(is_array($ IDS)isset($ IDS)){
foreach($ IDS为$id){
美元-> R - LPUSH('next_autoincrement,$id);
}
}
}

功能get_next_autoincrement(){
返回这个> R > LPOP('next_autoincrement);
}

}

$ createId =阵();
而(计数($ createId)<20){
$ =兰德(10004000);
如果(!in_array($num,createId美元))
{ } = $num createId美元;
}

$ =新通用();
$id -> set_queue_id($ createId);

var_dump($id -> get_next_autoincrement());
监视队列的数量,自动添加队列并获取ID,但不要使用它们。
以上是本文的全部内容,希望能对您有所帮助,希望大家多多支持
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部