首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    MySql中InnoDB为什么要建议用增列做主键

    这就要求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,因此每当有一条新的记录插入时,MySQL会根据其主键将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15.../16),则开辟一个新的页(节点) 4、增主键 如果使用增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页 5、非增主键 如果使用非增主键...(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉...总结 如果InnoDB的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高: 1、使用增列(INT/BIGINT类型)做主键,这时候写入顺序是增的...,和B+数叶子节点分裂顺序一致; 2、该不指定增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致; 除此以外

    3.9K20

    MySQL 案例:增列的空洞问题与“小”BUG

    前言 在 MySQL 的常见规范里面,每个都要设置主键,一般来说都会推荐增列作为主键,这和 MySQL 属于聚簇索引有关,顺序增长的主键比较合适。而增列中比较常遇见的问题就是增列的空洞。...> 增列如果浪费过多,即使是 int 也很可能会用完,然后再尝试插入数据的时候就会报错了。...现象是 MySQL 在 5.7 和 5.7 之前,增列的值是保存在内存中的,这就导致了 MySQL 重启之后会丢失这个增列的值,所以每次重启之后,MySQL 会把增列的值重置为增列的 MAX...> 可以看到原生的 MySQL 在重启之后增列的值被重置了。...当然,腾讯云数据库 MySQL 也修复了这个问题,可以放心使用~ 总结一下 增列虽然已经长时间,大范围的使用过了,但是也要注意这类技术可能会存在一些隐藏的问题,防微杜渐,保障业务安全运行是 DBA 应尽的职责

    2.1K100

    Mysql数据库insert into select 单插入常量

    学习中遇到的问题以及解决分享给大家 1.Mysql最基本的插入操作 INSERT INTO tb1 (col1, col2) VALUES (val1,val2 ) 可以解决最基本的插入数据的问题,...如果我们想在插入表格中已有的数据呢?显然需要其他的方法。...INTO SELECT 用法 INSERT INTO tb1 (col1,colx) SELECT col1,colx FROM tb2 我们可以通过 INSERT INTO SELECT 的用法在一个插入其他中的数据...这种问题可能对于精通数据库的大大来说很简单,网上的资料也很详细,作为新手的我可能理解的不到位。如果同时插入常量和表格中已有的数据的怎么办呢?...3.单插入常量 INSERT INTO tb1 (col1,colx) SELECT col1,valx FROM tb1 其实本质还是INSERT INTO SELECT 的用法,只是把其他化成了单

    2.3K30

    技术分享 | 从 MySQL 到 OBOracle:如何处理增列

    ---- 1背景描述 OceanBase 数据库中分为 MySQL 租户与 Oracle 租户,本文针对 OceanBase 中 Oracle 租户怎样创建增列,以及如何更简单方便的处理增列的问题展开介绍...发现问题场景 业务需要将数据库转换为 OceanBase 数据库,但源端涉及到 Oracle 及 MySQL 两种不同数据库,需要合并为 OceanBase 中单一的 Oracle 模式,其中源端 MySQL...在数据迁移中发现,MySQL 中的增列(AUTO_INCREMENT)在 OBOracle 中是不支持的,在 OBOracle 对应 MySQL 增列的功能是通过序列实现的。...因此,执行述语句后,当 tablename 插入一行数据时,会自动为 ID 列赋值为 sequence_name 序列的下一个值。 3、验证该方法是否达到增列的效果。...:new.id 表示新插入行的 ID 列,dual 是一个虚拟的,用于生成一行数据用以存储序列的下一个值。 4、验证该方法是否达到增列的效果。

    32120

    PHP MySQL数据库插入新记录

    PHP MySQL数据库插入新记录 向数据库插入数据 INSERT INTO 语句用于向数据库添加新记录。...> ========来自web表单的数据插入数据库======== 现在,我们创建一个 HTML 表单,这个表单可把新记录插入 "Persons" 。...insert.php"文件连接数据库,并通过 $_POST 变量从表单取回值。然后,mysql_query() 函数执行 INSERT INTO 语句,一条新的记录会添加到数据库中。...php $conn=mysql_connect('127.0.0.1','root','root')or die("数据库连接错误:".mysql_error()); //连接数据库 mysql_select_db...("db_user",$conn)or die("数据库访问错误:".mysql_error()); //选择数据库 mysql_query("setnames 'utf8'");//设置设置编码方式,

    20.5K30

    面试突击59:一个中可以有多个增列吗?

    PS:本文以下内容基于 MySQL InnoDB 数据库引擎。...当我们试图将自增值设置为比增列中的最大值还要小的值的时候,增值会自动变为增列的最大值 +1 的值,如下图所示: 3.一个可以有多个增列吗?...一个中只能有一个增列,这和一个只能有一个主键的规则类似,当我们尝试给一个添加一个增列时,可以正常添加成功,如下图所示: 当我们尝试给一个添加多个增列时,会提示只能有一个增列的报错信息...,如下图所示: 4.其他注意事项 除了一个只能添加一个增列之外,增列还需要注意以下两个问题。...一个中只能有一个增列,就像一个中只能有一个主键一样,如果设置多个增列,那么 SQL 执行就会报错。

    1.9K10

    一入职,就遇到MySQL这么大Bug!差点背锅走人

    mysql 中用增列作为主键时,先往表里插入 5 条数据,此时表里数据 id 为 1、2、3、4、5,如果此时删除 id=4、5 的数据后,再重启数据库,重启成功后向表里 insert 数据的时候...MySQL 通常使用的引擎都是 INNODB,在建时,一般使用增列作为的主键,这样的对提高性能有一定的帮助。...但是增列有一个坑,并且这个坑存在了很久,一直到 MySQL 8.0 版本,才修复了这个坑,这个坑就是增列变量 auto_increment 在 MySQL 重启后,有可能丢失。...「innodb 引擎(低版本):Innodb 中把增列作为主键 ID 时,增列是通过 auto-increment 计数器实现的,计数器的最大值是记录到内存中的,重启数据库后,会导致 auto-increment...然后重启数据库后,auto-increment 计数器的值变为 3,也就是 user 表里的增列 ID 的最大值 2 加 1。 此时在插入数据时,增 ID 会从 3 开始自增。

    1K20

    通过shell脚本模拟MySQL增列的不一致问题

    MySQL增列问题其实很有意思,在重启数据库之后,会按照max(id)+1的方式来计算,这样一个看起来有些别扭的实现方式在早期版本就饱受诟病,在MySQL 5.7都没有解决掉,终于在8.0松口了...主要的原因是什么呢,引用阿里数据库内核团队的解释(https://www.kancloud.cn/taobaomysql/monthly/67171):一方面InnoDB增值是存储在对象中的,对象又是放在缓存中的...,如果太多而不能全部放在缓存中的话,老的就会被置换出来,这种被置换出来的下次再使用的时候,就要重新打开一遍,对增列来说,这个过程就和实例重启类似,需要 select max(id) + 1 算一下增值...生成500个,然后插入一条数据,修改自增列值,然后查询表里的数据,使得数据能够刷出,稍作等待,查看show create table的结果。...SHOW CREATE TABLE t$i; EOF done 测试完成之后,来查看增列的值情况.

    1.4K40

    一道经典的MySQL面试题,答案出现三次反转

    确实,对于增列的问题,这个是MySQL里面饱受诟病的老问题了。...MyISAM存储引擎的test_myisam的增列还是不变,为6....限于篇幅,因为测试日志是很相似的,我就直接给出测试后的日志,这是在数据库重启之后的增列情况,可以看到test_innodb和test_myisam的增列是完全一样的。...8.0之前: 1)如果是MyISAM,则数据库重启后,ID值为18 2)如果是InnoDB,则数据库重启后,ID值为15 在MySQL 8.0开始, 1)如果是MyISAM...,则数据库重启后,ID值为18 2)如果是InnoDB,则数据库重启后,ID值为18 此处需要补充的是,对于ID增列,在MySQL 5.7中可以使用sys schema来进行有效监控了

    69331

    MySQL数据中的auto_increment增值属性及修改

    环境说明: MySQL 5.7 、MySQL 8.0 长期以来,我的博客数据库中连续文章的主键编号一直都不是连续的,让我这个强迫症晚期患看着很不舒服。...2、查看特定数据增值 要想查看某个数据增字段的当前增值,可用以下命令: SHOW TABLE STATUS FROM [数据库名] LIKE [名]; FROM [数据库名] 与 LIKE...所以,对于具有 AUTO_INCREMENT 属性的列,不用特意设置列值,而是直接将 NULL 值插入增列中去,数据库会自动根据当前的增值生成列值。...注意: 将 0 插入增列中的效果等同于插入 NULL 值; 当插入记录时,如果没有为增列指明一个值,那么也等同于插入 NULL; 使用 INSERT 语句插入记录时,如果为增列设置了一个值...,则成功插入这条记录,但增值不会更新,如果插入的值与已有的值重复,参考情况一 如果用 UPDATE 语句更新增列,情况与 INSERT 语句相同。

    3.2K10

    如何修改自增列值以及相应的解决方法

    SQL Server 平台修改自增列值 由于之前处理过sql server数据库的迁移工作,尝试过其增列值的变更,但是通过SQL 语句修改自增列值,是严格不允许的,直接报错(无法更新标识列 ’增列名称...该方法最大的缺点就是要通过手工辅助取消和添加增属性的。 还有一个方法,先将要修改的数据整理为T-SQL的插入脚本,再删除这批要修改的数据,在通过显示插入数据来实现。...MySQL 平台修改自增列mysql平台修改自增列值,有些麻烦的。...mysql中存在增列,如果其引擎是myisam,则该列可以为独立主键列,也可以为复合主键列,即该列必须为主键的关联列;如果其引擎是innodb,则该列必须是独立主键列。...我采用的方法是将两个增列值(比如1、2)分为以下三个步骤来实现: 1、先将自增列值为1的修改为0; 2、再将自增列值为2的修改为1; 3、再将自增列值为0的修改为2; 以下两种数据引擎的测试环境均是mysql

    3.5K80

    MySQL中都有哪些锁?

    这也就产生一个问题,当数据库重启后,第一次打开时,MySQL会找到这个增列的当前最大值maxId,然后将maxId + 1作为这个增值。但是这个增值不一定和重启之前值一样。...要回答这个问题,首先要知道MySQL是如何给一条未指定增列插入SQL自动赋值和递增增值的。...具体来说分为下面几步: 当MySQL发现插入SQL未指定增列的值时,先从内存获取当前的增值 inc 修改插入SQL,指定增列的值为inc 将内存中当前的增值进行+1操作 继续执行SQL,进行插入...该行插入失败。但是我们发现增列的值inc却已经进行了+1操作。下一次再进行插入时,获取到的增列的值和数据库中已经存在的增列的值就会不连续。因为上一次的事务插入的行因为失败回滚了。...其实在 MySQL InnoDB 存储引擎的内存结构里面,对于每张包含增列,都维护了一个增长计数器(auto-increment counter),每当进行插入时,就会对这个计数器进行+1操作,

    89651
    领券