为什么InnoDB表要建议用自增列做主键而MyISAM不需要

MyISAM 和 InnoDB的区别 MySQL中MyISAM和InnoDB的主要区别:InnoDB支持事务、行级锁、外键约束和崩溃恢复,采用聚簇索引,适合高并发写入场景;MyISAM仅支持表级锁,无事务功能,索引与数据分离存储,适合读多写少的简单查询。InnoDB是现代应用的首选,而MyISAM逐渐被淘汰。建议新项目优先使用InnoDB,并可通过ALTER TABLE命令切换引擎。 阅读详情

我们先了解下InnoDB引擎表的一些关键特征:

  1. InnoDB引擎表是基于B+树的索引组织表(IOT); 每个表都需要有一个聚集索引(clustered index);
  2. 所有的行记录都存储在B+树的叶子节点(leaf pages of the tree); 基于聚集索引的增、删、改、查的效率相对是最高的;
  3. 如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择其作为聚集索引;
  4. 如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯一索引作为主键索引;
  5. 如果也没有这样的唯一索引,则InnoDB会选择内置6字节长的ROWID作为隐含的聚集索引(ROWID随着行记录的写入而主键递增,这个ROWID不像ORACLE的ROWID那样可引用,是隐含的)。

综上总结,如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高:

  1. 使用自增列(INT/BIGINT类型)做主键,这时候写入顺序是自增的,和B+数叶子节点分裂顺序一致;
  2. 该表不指定自增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致;
  3. 除此以外,如果一个InnoDB表又没有显示主键,又有可以被选择为主键的唯一索引,但该唯一索引可能不是递增关系时(例如字符串、UUID、多字段联合唯一索引的情况),该表的存取效率就会比较差。
    实际情况是如何呢?经过简单TPCC基准测试,修改为使用自增列作为主键与原始表结构分别进行TPCC测试,前者的TpmC结果比后者高9%倍。

以上内容转自http://imysql.cn/2014/09/14/mysql-faq-why-innodb-table-using-autoinc-int-as-pk.shtml


而MyISAM的b树叶子节点上存放的不是数据,而是数据的地址。MyISAM按照插入的顺序把值保存在磁盘上,由于行的尺寸是固定的,MyISAM能从表开头跳过所需的字节找到需要的行。

VerilogEval实战指南:从基准测试到模型微调的全流程解析 本文提供了VerilogEval实战指南,详细解析了从基准测试到模型微调的全流程。VerilogEval是一个自动化、标准化的测试框架,用于客观评估大语言模型生成Verilog硬件代码的能力。文章涵盖了环境搭建、核心机制解析、利用其生成合成数据进行模型微调的策略,以及如何将其工程化集成到自动化评估流程中,为硬件设计领域的AI应用提供了完整的方法论。 阅读详情

相关推荐

Calibre LVS效率翻倍秘籍:用Hierarchical Flow处理亿级晶体管设计的5个关键阶段

本文详细解析了如何利用Hierarchical Flow技术提升Calibre LVS在亿级晶体管SoC设计中的验证效率。通过五个关键阶段的分层验证流程,包括顶层抽象验证、模块级独立验证等,可显著降低内存占用40-60%,缩短迭代周期50-70%,特别适用于SMIC等先进工艺节点。文章还分享了算力资源优化、并行化处理等实战技巧,帮助工程师应对大规模芯片验证挑战。

sam99的博客 768

为什么InnoDB表要建议用自增列做主键而MyISAM却不需要

在创建数据库的时候我们总是会创建一个自增的主键ID,可是你想过没有?这个自增的ID为什么要设置?可不可以不设置,不设置的后果是什么?带着这来两个疑问我们来验证一下。 CREATE TABLE `student_table` ( `id` int NOT NULL AUTO_INCREMENT, `stuname` varchar(255) DEFAULT NULL, `birthday` date DEFAULT NULL, `create_time` datetime DEFAULT

守望希望 881

Agent框架系列:1-低代码智能体平台深度解析Dify、Coze、n8n

Dify、Coze 和 n8n 是三大主流低代码智能体平台,各有侧重。Dify 适合企业级 AI 应用,具备强大的 RAG 和知识库管理能力,技术栈为 Python + React。Coze 由字节推出,主打零代码和快速原型开发,集成 60+ 插件,极适合非技术用户。n8n 以工作流自动化和系统集成为核心,支持 400+ 外部应用,基于 Node.js + Vue,扩展性极强。选择建议:非技术团队选 Coze,AI 应用选 Dify,复杂自动化与集成选 n8n。可根据实际需求混合使用,最大化平台优势。

3078

MySQL InnoDB数据表不设置主键

3、第三种情况:用户既没有定义主键,也没有定义唯一索引,那么InnoDB会自动生成一个不可见的ROW_ID的列名为GEN_CLUST_INDEX的聚簇索引,该列是一个6字节的自增数值,随着插入而自增。而且不设置主键不单单影响到查询,在进行写操作的时候,由于ROW_ID是共享的,这意味着插入的时候需要共享该序列,那么高并发插入的时候为了保持唯一性就避免不了锁的竞争,进而影响性能。由以上分析可以推论,在建表的时候无论如何都要设置主键,如果没有可用作主键的字段,可以设计一个业务无关的字段,比如xx_id。

weixin_42379509的博客 1059

IEEE论文接收后,收到Proof邮件别慌!手把手教你48小时内搞定校样(附详细截图)

本文详细解析了IEEE论文接收后Proof校样的全流程,从邮件关键信息解码到精准修改标注,提供48小时内高效完成校样的实战指南。涵盖登录技巧、文件验证、修改标注黄金法则及九宫格检查清单,帮助作者避免常见错误,确保论文顺利发表。

weixin_30652491的博客 562

任务混部最少服务器数量计算问题

这里的并行度指的是该任务运行时会占用的服务器数量。要注意的是,一个服务器在每个时刻可以被任意任务使用,但同一时刻最多只能被一个任务占用,并且任务运行结束后会立即释放服务器(结束时刻不占用)。最后,我们从字典中找出服务器数量的最大值,这个最大值就是完成这批任务混部最少需要的服务器数量。对于每个任务,我们会遍历其对应的时间区间,将该任务的并行度累加到对应时刻的服务器数量上。任务混部的目标是让这批任务由同一批服务器承载运行,你需要计算完成这批任务混部最少需要多少服务器,以此来最大化控制资源成本。

m0_62153576的博客 104

[MySQL FAQ]系列 — 为什么InnoDB表要建议用自增列做主键

原文地址:http://imysql.com/2014/09/14/mysql-faq-why-innodb-table-using-autoinc-int-as-pk.shtml 我们先了解下InnoDB引擎表的一些关键特征: InnoDB引擎表是基于B+树的索引组织表(IOT); 每个表都需要有一个聚集索引(clustered index); 所有的行记录都存储在B+树

huyangg的专栏 1192

虚拟机VMware Horizon Client与主机之间建立共享文件夹

因经常需要在虚拟机和主机之间传递一些日常文件,所以建立共享文件夹。 虚拟机中安装的系统为win10,主机中的系统为win10。 步骤: 第一步:先在虚拟机win10中新建文件夹(我重命名为“共享文件夹”),然后右键属性->共享->共享 进去之后点击自己的账户名 然后点共享。操作完成后,再返回属性界面就能看到该文件夹已经共享而且出现了共享链接,记下此链接。 第二步:回到主机桌面->此电脑->最上面计算机->添加一个网络位置- 点击下一步 然后自定义网络位置,下一步,如下图

AnChenliang_1002的博客 1万+

MyISAM与InnoDB区别

在MySQL数据库中,有四种存储引擎:MEMORY存储引擎、MERGE存储引擎、MyIASM存储引擎、Innodb存储引擎。就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。表级锁:直接锁定整张表,在锁定期间,其他进程无法对该表进行写操作,如果设置的是写锁,那么其他进程读也不允许,因此myisam支持的并发量低,但myisam不会出现死锁;支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。myisam不支持事务;

LY83984的博客 825

宽压 DC⇌DC 也能“随心所欲”——全桥 LLC 混合控制硬核拆解

硬件派 vs. 软件派:多电平是“器件堆砌”,混合控制是“算法魔改”。预算紧 → 先搞软件。仿真别嫌烦:PLECS 把两条曲线扫透,切换点、死区、φ 都调到波形平滑再上板。温升留 20 ℃ 余量:车规≥125 ℃,实验室测 105 ℃ 就算危险,别玩极限。

weixin_43199439的博客 924

第10章《VTK自定义部件Widget》

是用于交互式操作 3D 场景的组件,例如移动对象、调整尺寸、创建标注等。VTK 提供了一些内置的 Widget,如。,用户可以点击鼠标,在 3D 场景中放置一个点。负责绘制一个点,并控制其颜色、大小等。,可用于 3D 标注、对象拾取等应用!等,但在某些应用中,我们需要。这样,我们就创建了一个。

yumeiguo的博客 523

MySQL面试题之为什么要为innodb表设置自增列做主键?

为什么要为innodb表设置自增列做主键? 1.使用自增列做主键,写入顺序是自增的,和B+数叶子节点分裂顺序一致 2.表不指定自增列做主键,同时也没有可以被选为主键的唯一索引,InnoDB就会选择内置的rowid作为主键,写入顺序和rowid增长顺序一致 所以InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高 转载于:https://www.cnblogs...

weixin_34310369的博客 319

使用epiDisplay包中的logistic

其中的logistic.display函数可以用于获取逻辑回归模型的汇总统计信息,包括自变量的优势比和置信区间,以及回归系数的Wald检验的p值。最后,我们使用print函数打印出汇总统计信息。使用epiDisplay包中的logistic.display函数获取逻辑回归模型的汇总统计信息(包括自变量的初始和调整后的优势比及置信区间,回归系数的Wald检验的p值)- R语言。通过使用logistic.display函数,我们可以方便地获取逻辑回归模型的重要统计信息,并对自变量的影响进行解释和推断。

CyberJolt的博客 606

(转)mysql中InnoDB表为什么要建议用自增列做主键

InnoDB引擎表的特点 1、InnoDB引擎表是基于B+树的索引组织表(IOT) 关于B+树 (图片来源于网上) B+ 树的特点: (1)所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的; (2)不可能在非叶子结点命中; (3)非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层; 2、如果我们定义了主键(...

weixin_30381317的博客 157

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

为什么innodb表最好自增列做主键

InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MyS

qq_35668657的博客 958

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

为什么InnoDB使用索引时不用锁表,可以锁行,而MyIsam则只锁表

https://blog.youkuaiyun.com/silyvin/article/details/80140153 涉及到这个...

1400

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySQL使用AUTO_INCREMENT列的表注意事项之update自增列篇

1. 说明 (1)对于MyISAM表,如果用UPDATE更新自增列,如果列值与已有的值重复,则会出错;如果大于已有的最大值,则会自动更新表的AUTO_INCREMENT,操作是安全的。 (2)对于innodb表,update auto_increment字段,如果列值与已有的值重复,则会出错;如果大于已有的最大值,可能会引入一个坑,会造成编号重复错误,插入数据失败的情况,可见在update自增列值是要注意。

BOSCO 蜻蜓点水,一点一滴 1万+

mysql自增列注意事项_MySQL使用AUTO_INCREMENT列的表注意事项之update自增列篇

1)对于MyISAM表,如果用UPDATE更新自增列,如果列值与已有的值重复,则会出错;如果大于已有的最大值,则会自动更新表的AUTO_INCREMENT,操作是安全的。(2)对于innodb表,update auto_increment字段,如果列值与已有的值重复,则会出错;如果大于已有的最大值,可能会引入一个坑,会造成编号重复错误,插入数据失败的情况,可见在update自增列值是要注意。环境描...

weixin_30605469的博客 569

InnoDB 和 MyISAM 的比较?

InnoDB 和 MyISAM 的比较? InnoDB: InnoDB是Mysql默认的事务型引擎,用于事务处理,具有事务的ACID特性。 支持行级锁 采用MVCC来支持高并发,并且实现了四种隔离级别,默认级别是可重复读,而且通过间隙锁策略防止幻读的出现,间隙锁不仅锁定查询涉及的行,还会锁定索引中的间隙,来防止幻影行的插入。 InnoDB表采用聚集的方式存储数据,因此每张表的存储都是按主键的顺序...

dl674756321的博客 230

MySQL存储引擎 - MyISAM与InnoDB的优劣

目录一、MyISAM 与 InnoDB 的异同特性对比表格二、MyISAM的特性1. 优势2.存储方式3.存储格式三、InnoDB的特性1. 优势2.自增列3.外键约束4.存储方式四、总结1.MyISAM2.InnoDB五、待发散话题 一、MyISAM 与 InnoDB 的异同 特性对比表格 特点 MyISAM InnoDB 存储限制 有 64TB 事务安全 支持 锁机制...

写带马 606

InnoDB 中文参考手册 --- 4 建立 InnoDB 表

code {color:purple} tt {color:green} samp {color:navy} pre {color:maroon} <!--x = new Date() function cal() { y = new Date() diff = y.getTime() - x.getTime() document.writ

shuixin13的专栏 1601

mysql自增列注意事项_MySQL使用AUTO_INCREMENT列的表注意事项之update自增列篇_MySQL

1. 说明(1)对于MyISAM表,如果用UPDATE更新自增列,如果列值与已有的值重复,则会出错;如果大于已有的最大值,则会自动更新表的AUTO_INCREMENT,操作是安全的。(2)对于innodb表,update auto_increment字段,如果列值与已有的值重复,则会出错;如果大于已有的最大值,可能会引入一个坑,会造成编号重复错误,插入数据失败的情况,可见在update自增列值是要...

weixin_39865952的博客 490

innodb 自增列重复值问题

1 innodb 自增列出现重复值的问题 先从问题入手,重现下这个bug use test; drop table t1; create table t1(id int auto_increment, a int, primary key (id)) engine=innodb; insert into t1 values (1,2);insert into t1...

Yijia0531的博客 166

MyISAM 引擎和 InnoDB 引擎中索引存储的区别

MyISAM 存储引擎不支持行级锁,只有表级锁;不支持事务,也不支持外键,主要面向 OLAP 应用,是 MySQL 数据库5.5.8 版本之前默认的存储引擎,MyISAM 适用于不需要关心事务,读多写少的场景。每张 MyISAM 表在磁盘上会创建三个文件:.frm,.MYD 和 .MYI,其中 .frm 文件为表结构文件,每个存储引擎都会有这个文件,.MYD 文件用来存储数据,.MYI 文件用来存储索引,也就是说 MyISAM 表的数据和索引是分开存储的,这一点和 InnoDB 不一样。

一个双子座的Java攻城狮 731
上一篇: kmp算法及解释
下一篇: bfs和dfs:poj2386和leetcode130
寂寞灵魂
博客等级 码龄15年 111粉丝 284原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值