首先自增主键在insert的时候,因为是自增,那么是不是要有一个自增值锁来防止这个自增值出现重复?有的话那岂不是会影响性能?
我观察过BAT以及国内很多大型互联网公司的网站,比如说京东的商品id,百度的用户id,新浪微博的用户id,贴吧的帖子id都是自增主键(长期观察可以发现他们随时间增长,应该是自增),当然也有反例,比如说QQ空间的说说(内部名称应该是mood,因为说说最早以前是由心情模块改来的)说说id用的就是类似于UUID这样的主键(其实格式很像md5)。
他们这样设计有什么考虑吗?(好处坏处都有哪些?)
其他数据库没用过,不做评价。
对于
MySQL
来说,使用自增还是比较划算的,因为索引使用的底层数据结构(B+树)的原因,如果是自增ID
的话,那么数据插入时最多就是引起节点的分裂,而如果是使用非自增ID
,则有可能会导致节点移动和分裂。如果使用
MySQL
又使用UUID
作为主键的话,那么插入效率必然大幅下降。当然,使用自增也会带来问题,就是日后如果要做水平切分的话,那么有可能会产生冲突的主键, 所以也可以选择不使用数据库的自增,而是自己生成全局唯一的递增整数作为主键。