数据库自增主键ID
自增的主键的值是顺序的,所以存储引擎(MyISAM、InnoDB)把每一条记录都存储在一条记录的后面。当达到页面的最大填充因子时候(innodb默认的最大填充因子是页大小的15/16,会留出1/16的空间留作以后的修改)
优点:
- 下一条记录就会写入新的页中,一旦数据按照这种顺序的方式加载,主键页就会近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费;
- 新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗;
- 减少了页分裂和碎片的产生。
缺点:
- 因为自增ID步进值是固定的,如果别人爬取数据库,会获取到业务增长信息,从而分析出经营情况;
- 如果在并发情况下写入,自增主键的上界会造成明显的锁挣用,并发插入会导致间隙锁竞争;
- Auto_Increment锁机制会造成自增锁的抢夺,有一定的性能损失。
UUID的索引
- 数据生成没有规律,无法做到按顺序存储;
- 写入的目标页很可能已经刷新到磁盘上并且从缓存上移除,或者还没有被加载到缓存中,在插入之前存储引擎不得不先找到并从磁盘读取目标页到内存中,这将导致大量的随机IO;
- 因为写入是乱序的,存储引擎不得不频繁的做页分裂操作,以便为新的行分配空间,页分裂导致移动大量的数据,一次插入最少需要修改三个页以上;
- 由于频繁的页分裂,页会变得稀疏并被不规则的填充,最终会导致数据会有碎片
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。