数据库表 id 设为 auto_increment 是不是一个好习惯?

2014-07-30 19:31:24 +08:00
 jsxqf
4787 次点击
所在节点    问与答
19 条回复
rainysia
2014-07-30 19:35:31 +08:00
看情况而言
有些情况需要自增来设置log_id, 至少能保证唯一性
有些情况下就需要用代码直接生成id, 预生成id模式
你去看电商的uid, pid, 淘宝店铺的店铺id, qq号. 这些实际都是自增的.
em70
2014-07-30 19:37:34 +08:00
不自增你还要id干嘛
raincious
2014-07-30 19:38:35 +08:00
@rainysia QQ号是自增?我一直以为是分配好了放在一个池子里的呢。
wy315700
2014-07-30 19:43:39 +08:00
@rainysia
@raincious
QQ号是根据某个算法算出来的伪自增。

话说你们俩的ID。。。
kmvan
2014-07-30 21:00:13 +08:00
你们两个的id也是自增的吧!
我帮楼上说了
Aoliz
2014-07-30 21:02:00 +08:00
有时候为了防止爬虫爬数据,会选择不自增的方式?
shinwood
2014-07-30 21:04:07 +08:00
自增要有一个,另外可以加设一个唯一的id防爬虫。
em70
2014-07-30 21:16:55 +08:00
@wy315700
@raincious
@raincious

QQ号绝对不是自增,有号码池,不一定先注册就比后注册数字小,特殊号码早就被提取出来单独销售了,没意义的号才放池子里.曾经听一个去腾讯实习的哥们说,QQ号只用了一个字节储存.
raincious
2014-07-30 21:39:38 +08:00
@em70 真的?8 Bit?怎么做到的?
O21
2014-07-30 21:44:09 +08:00
我一般都用自增长。。。方便
em70
2014-07-30 21:50:40 +08:00
@raincious 我也没想明白,就算32位,也只有8位数,但现在QQ也10位了
YouXia
2014-07-30 22:32:22 +08:00
@em70
应该不是一个字节,应该是一个int,一个int倒是足够存储了。假如QQ数字为V,则用以下方式表示:

int id = V / 32;

int shift = V % 32;
jsonline
2014-07-30 22:43:47 +08:00
上面不要搞笑,从 2011 年起 QQ 上是 64 位的,8 bytes, 64 bits.
Automan
2014-07-30 22:49:57 +08:00
看应用场景吧。。比如优惠券号码之类的,就非常不适合用自增。另外多机负载下,自增 id的同步也是个大问题。
Automan
2014-07-30 22:50:54 +08:00
在一般情况下,自增id算是效率最高最方便的产生唯一ID的方法了吧
YouXia
2014-07-30 23:04:38 +08:00
@jsonline

只是举了例子说明了下一个int足够存储QQ所有号码了。

另外,一般情况下(当然这个还是看编译器),多数64位系统下sizeof(int) = 4 ,只是long int 变为8了。
awanabe
2014-07-30 23:32:35 +08:00
自己做一个sequence吧...
如果分布式的话就需要给集群不同的标示, 从而生成独立的id
csx163
2014-07-30 23:41:58 +08:00
查询上下两条记录就靠这个了...
rainysia
2014-07-30 23:56:54 +08:00
晕. 我说的是最开始的时候, qq号是自增的...
现在肯定都是预生成了.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/125324

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX