InnoDB聚簇索引的背景

在InnoDB索引页的物理结构中,“我”讲述了”InnoDB中一切都是索引“。这意味着每个InnoDB引擎的表必须有一个“聚簇索引”,通常是主键。在手册中聚簇索引和第二索引有说:如果表中没有主键或者一个合适的的唯一索引,InnoDB内部会以一个包含行ID值的合成列生成一个隐藏的聚簇索引。表中的行是按照InnoDB分配的ID排序的。行ID是一个6字节的字段,随着一个新行的插入单调增加。因此,行ID顺序物理上是插入顺序。

“我”之前假设过这就意味着一个不可见的列将会和自增的实现 使用相同的序列生成代码(它自身也有一些拓展性问题)。然而事实上它们是完全不同的实现方式。

隐式行ID的实现方式

如手册所说,事实上是这么实现的:如果一个表没有申明主键和一个不为null的唯一索引,InnoDB将会自动增加一个6字节(48位)的整数列,被叫做行ID,聚集数据都是依靠这列的。这列既不能通过任何查询获取到也不能做像基于行复制的任何内部操作。

手册上没提及的是:所有的表将使用行ID列共享相同的全局计数序列(手册上说“单调增长”并且没有阐明),这是数据字典的一部分。所有行ID可用的最大值(技术上讲,下一个被用到的ID)被储存于系统表空间,在第七页(type SYS),在数据字典的头部(DICT_HDR_ROW_ID字段)。

这个全局的计数权重被dict_sys->mutex保护,甚至是递增(与使用原子增量相反)。 在include / dict0boot.ic处实现(删除了很多空行):

38 UNIV_INLINE

39 row_id_t

40 dict_sys_get_new_row_id(void)

41 /*=========================*/

42 {

43 row_id_t id;

44

45 mutex_enter(&(dict_sys->mutex));

47 id = dict_sys->row_id;

49 if (0 == (id % DICT_HDR_ROW_ID_WRITE_MARGIN)) {

51 dict_hdr_flush_row_id();

52 }

54 dict_sys->row_id++;

56 mutex_exit(&(dict_sys->mutex));

57

58 return(id);

59 }

(你可能也注意到这段代码缺乏对分配给行ID超出的48位的保护。这是不必要草率的编程,但是甚至每秒连续插入1百万(可能有点乐观),也要9年才能耗尽ID空间。“我”猜也是没事的)

确保生成不冲突的ID

计数器每生成256个ID被刷新(以上定义的DICT_HDR_ROW_ID_WRITE_MARGIN),可以修改记录于事务日志的系统数据字典页的值。在启动时,InnoDB将会增加存储于硬盘的DICT_HDR_ROW_ID,至少256,至多511。这样确保生成的任何ID都将小于新的起始值,因此将不会有冲突。

性能和资源冲突的影响

InnoDB中一些其他代码是被dict_sys->mutex保护的,“我”认为任何使用隐式聚簇索引(行ID)的表可以预料到在删(不关联)的表期间经历随机插入的停顿。形成对比地,隐式索引插入到多个表可能会有性能约束,因为将会在共享互斥锁和共享计数变量的缓存争用时序列化。另外,不管事务是否已经提交了(或者未提交),每256个生成的值将会导致系统页修改的写日志和刷新。

本文章翻译自https://blog.jcole.us/2013/05/02/how-does-innodb-behave-without-a-primary-key/

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要PHP进阶架构师>>>视频、面试文档免费获取​docs.qq.com

或 者关注咱们下面的知乎专栏PHP大神进阶​zhuanlan.zhihu.com

mysql删除没有索引页_InnoDB中没有主键是如何运转的相关推荐

  1. mysql删除表里所有自增行,主键重新开始递增的方法

    ALTER TABLE customer_inf  AUTO_INCREMENT =0;

  2. mysql如何建立索引workbench_MySQL数据库中如何正确的理解与使用索引?

    索引是存储引擎用于快速查找记录的一种数据结构,我们可以通过合理的使用数据库索引以提高数据库的访问效率.接下来主要介绍在MySQL 数据库中索引类型,以及如何创建出更加合理且高效的索引技巧. MySQL ...

  3. mysql b tree索引原理_MySQL中B+Tree索引原理

    B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引.B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的.在讲B ...

  4. Mysql 索引(三)—— 不同索引的创建方式(主键索引、普通索引、唯一键索引)

    了解了主键索引的底层原理,主键索引其实就是根据主键字段建立相关的数据结构(B+树),此后在使用主键字段作为条件查询时,会直接根据主键查找B+树的叶子结点.除了主键索引外,普通索引和唯一键索引也是如此, ...

  5. mysql 导入主键冲突_MySQL 处理插入过程中的主键唯一键重复值的解决方法

    本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IG ...

  6. MySQL中的主键约束和外键约束

    1.主键约束 表通常具有包含唯一标识表中每一行的值的一列或一组列. 这样的一列或多列称为表的主键 (PK),用于强制表的实体完整性. 由于主键约束可保证数据的唯一性,因此经常对标识列定义这种约束. 如 ...

  7. mysql 主键值向后递增1_mysql中的主键递增

    CREATE TABLE customers ( cust_id int NOT NULL AUTO_INCREMENT, cust_name char(50) NOT NULL , PRIMARY ...

  8. mysql中的主键关键字_MySQL主键(PRIMARY KEY)

    "主键(PRIMARY KEY)"的完整称呼是"主键约束".MySQL 主键约束是一个列或者列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键 ...

  9. mysql 隐式主键_MySQL中复合主键性能的缺点

    我们有一个表,该表具有由三个字段组成的复合主键(在MySQL 5.1中是这样). 该表上每秒有近200个插入和200个选择,并且表的大小约为100万行,并且还在不断增加. 我的问题是:"复合 ...

最新文章

  1. mockito_Mockito 101
  2. jQuery-动画点击淡化消失
  3. 配置apache虚拟主机
  4. mysql php 乱码问题_解决php与mysql中文乱码问题
  5. springcloud 服务网关Zuul实战(二)路由访问映射规则
  6. 中国的第一座基站,你知道在哪吗?
  7. Ext Store Proxy Ajax
  8. 运用ffmpeg生成MP4文件
  9. 洛谷P1217回文质数
  10. OpenCV2:幼儿园篇 第八章 视频操作
  11. PLSQL使用相关详细配置
  12. java 病毒查杀_Java清除exe文件中的病毒
  13. selenium实例自动登陆知乎
  14. 《JETS Jointly Training FastSpeech2 and HiFi-GAN for End to End Text to Speech》
  15. Excel应用-各地GDP的综合对比图表-Part2(平均线图、复合饼图、瀑布图、帕累托图)
  16. React基础(2)—— React函数式组件使用ref
  17. 数商云精细化工行业管理平台一体化信息化解决方案
  18. 【总结】华为交换机和锐捷交换机的syslog配置
  19. Mean squared error MSE即方差
  20. 数据科学家分享:“大数据全栈技术与商用平台架构设计之路”

热门文章

  1. 在一个有返回值的方法中,用block回传的解决方法
  2. 如何处理Entity Framework中的DbUpdateConcurrencyException异常
  3. 导入数据任务(id:373985)异常, 错误信息:解析导入文件错误,请检查导入文件内容,仅支持导入json格式数据及excel文件
  4. S2-045漏洞利用工具解决方案
  5. 什么!在CSS中的重要意义? [重复]
  6. SQLAlchemy按降序排列?
  7. 获取应用程序文件夹路径的最佳方法
  8. git config --global写到哪里?
  9. 访问“ for”循环中的索引?
  10. iOS使用shell脚本批量修改属性