博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
InnoDB为什么要使用auto_Increment
阅读量:4313 次
发布时间:2019-06-06

本文共 1515 字,大约阅读时间需要 5 分钟。

在Mysql表设计中,通常会使用一个与业务无关的自增列做为主键。

这是因为Mysql默认使用B-Tree索引,你可以简单理解为“排好序的快速查找结构”。
如下是一个B-Tree的结构图,2层B+树,每个页面的扇出为4;并有1到6五条记录;上层记录保存每个页面的最小值;每个页面通过双向链表链接起来的;
mysql1.png当你插入记录7时,就会发生页面分裂:
msyql2.png
如上可见分裂产生了记录移动,但是优化后的分裂操作无需记录移动:
mysql3.png
在InnoDB的实现中,为每个索引页面维护了一个上次插入的位置,以及上次的插入是递增/递减的标识。根据这些信息,InnoDB能够判断出新插入到页面中的记录,是否仍旧满足递增/递减的约束,若满足约束,则采用优化后的分裂策略;
所以建议使用一列顺序递增的 ID 来作为主键,但不必是数据库的autoincrement字段,只要满足顺序增加即可 。很多大型应用会有顺序递增的ID生成器。
测试如下:

 
  1. CREATE TABLE `table1` (
  2. `id` int(10) NOT NULL AUTO_INCREMENT,
  3. `text` varchar(255) NOT NULL,
  4. PRIMARY KEY (`id`)
  5. ) ENGINE=InnoDB AUTO_INCREMENT=200001 DEFAULT CHARSET=utf8
  6.  
  7. CREATE TABLE `table2` (
  8. `id` int(10) NOT NULL,
  9. `text` varchar(255) NOT NULL,
  10. KEY `id` (`id`)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

脚本如下:

 
  1. $link = mysql_connect('127.0.0.1', 'root', 'mckee');
  2. mysql_select_db('test', $link);
  3.  
  4. $count = 200000;
  5. $table1_data = range(1, $count);
  6. $text = 'just test!just test!just test!just test!just test!';
  7.  
  8. $time1 = get_time();
  9. foreach ($table1_data as $row) {
  10. $id = rand(1,100000000);
  11. mysql_query("insert into table1(text) values ('{$text}')");
  12. }
  13. $time2 = get_time();
  14. foreach ($table1_data as $row) {
  15. $id = rand(1,100000000);
  16. mysql_query("insert into table2(id, text) values ({$id}, '{$text}')");
  17. }
  18. $time3 = get_time();
  19.  
  20. echo 'tabe1 insert execute time:' . ($time2 - $time1) . PHP_EOL;
  21. echo 'tabe2 insert execute time:' . ($time3 - $time2) . PHP_EOL;
  22.  
  23. function get_time()
  24. {
  25. list( $usec , $sec ) = explode ( " " , microtime ());
  26. return ((float) $usec + (float) $sec );
  27. }

转载于:https://www.cnblogs.com/lushilin/p/6098586.html

你可能感兴趣的文章
Windows Server 2012和2008中使用计划任务定时执行BAT批处理文件 定时备份mysql数据...
查看>>
费马小定理与GCD&LCM
查看>>
P1077 摆花
查看>>
zynq修改ramdisk文件系统
查看>>
C#测量程序运行时间及cpu使用时间
查看>>
并发编程
查看>>
我自己曾经经历的CMMI3认证通过关于软件测试的访谈【转载】
查看>>
C# 操作Excel ——Excel获取数据、时间、图片
查看>>
【Express系列】第3篇——接入mysql
查看>>
js 高亮显示关键字
查看>>
CPU工作原理简图
查看>>
进程互斥于同步
查看>>
小米公布2017二季度手机出货量:环比增长70%
查看>>
IntelliJ Idea 集成svn 和使用[转自网络]
查看>>
VS2013 密钥 – 所有版本
查看>>
缓冲一日
查看>>
apache常用配置文件讲解
查看>>
html设置透明度
查看>>
读写锁详解
查看>>
<taglib>报错
查看>>