首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySqlInnoDB表为什么要建议用增列做主键

(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存清掉...,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE来重建表并优化填充页面。...总结 如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的,也就是下面这几种情况的存取效率最高: 1、使用增列(INT/BIGINT类型)做主键,这时候写入顺序是增的...,和B+数叶子节点分裂顺序一致; 2、该表不指定增列做主键,同时也没有可以被选为主键的唯一索引(上面的条件),这时候InnoDB会选择内置的ROWID作为主键,写入顺序和ROWID增长顺序一致; 除此以外...《高性能MySQL的原话 ? ?

3.9K20
您找到你想要的搜索结果了吗?
是的
没有找到

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

前言 在 MySQL 的常见规范里面,每个表都要设置主键,一般来说都会推荐增列作为主键,这和 MySQL 属于聚簇索引表有关,顺序增长的主键比较合适。而增列中比较常遇见的问题就是增列的空洞。...问题的监控 增列的监控,在 5.7 版本(低于 5.7 的还是尽快升级上来吧)是比较方便的,可以在 sys 视图中直接查询视图 mysql> select * from sys.schema_auto_increment_columns...现象是 MySQL 在 5.7 和 5.7 之前,增列的值是保存在内存的,这就导致了 MySQL 重启之后会丢失这个增列的值,所以每次重启之后,MySQL 会把表的增列的值重置为增列的 MAX...> 可以看到原生的 MySQL 在重启之后增列的值被重置了。...这个现象被称之为 BUG 主要是在现在的互联网业务,支撑业务数据的不仅仅只有 MySQL,还可能会有 Redis,RabbitMQ 等缓存和消息队列或者是单独的 MySQL 日志归档库,增列可能会被用来作为关联各个存储之间的

2.1K100

MySQL查询结果记录行号

在其他的关系型数据库,都有rownum这类型的内置函数来提供查询结果的行号,但是MySQL没有,阿福也一直觉得奇怪。 虽然没有这玩意,但是需求还是要完成的,所以只能用其他的途径来实现了。...方法是通过预定义变量增来实现: set @myVar = 0 ; select (@myVar := @myVar + 1) as rowNum ,otherColoum from table; 懂了么...其实熟悉MySQL语句的应该都能看懂。无非就是定义了一个用户变量来实现增。 当然这个变量是永久变量还是临时变量就不晓得了。...阿福在测试的时候发现,该变量接执行结果后还是保留的,却不知道数据库重启之后该变量是否保留。 未经允许不得转载:RffanLAB|Rffan实验室 » MySQL查询结果记录行号

6.5K10

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

---- 1背景描述 OceanBase 数据库中分为 MySQL 租户与 Oracle 租户,本文针对 OceanBase Oracle 租户怎样创建增列,以及如何更简单方便的处理增列的问题展开介绍...在数据迁移中发现,MySQL 增列(AUTO_INCREMENT)在 OBOracle 是不支持的,在 OBOracle 对应 MySQL 增列的功能是通过序列实现的。...因此,执行述语句后,当 tablename 表插入一行数据时,会自动为 ID 列赋值为 sequence_name 序列的下一个值。 3、验证该方法是否达到增列的效果。...4、验证该方法是否达到增列的效果。...以上就是对 OBOracle 如何创建增列的几种方法的总结。有需要的小伙伴可以试试(●'◡'●)。 本文关键字:#OceanBase# #Oracle# #数据迁移#

32020

mysql查询结果输出到文件

/lib/mysql/msg_data.xls ' ; 注意事项: 0)可能会报没有 select command denied(没有查询权限) 或者 Access denied for user(没有...file权限) ,增加权限之后即可。...3) 生成的文件可能会有中文乱码问题,可以在语句后面+CHARACTER SET gbk (utf8等) 例如: select * from user INTO OUTFILE '/var/lib.../mysql/msg_data.csv ' CHARACTER SET gbk; 4)如果sql查询出来的数据包含有很大的数值型数据,则在excel这些数值数据可能会出问题,因此,可以先导出为.txt.../.csv文件格式,再复制黏贴到excel文件(首先设置单元格格式为文本) 方式二 在登录某服务器后,采用 mysql 命令执行 ,不需要登录进mysql命令行环境下。

6.9K20

Mysql连接查询「建议收藏」

连接查询 假想以下场景:某一电商网站想要对站内产品做层级分类,一个类别下面有若干子类,子类下面也会有别的子类。...我们可以在数据库创建两个字段来存储id和类别名称,使用第三个字段存储类别的子类或者父类的id,最后通过连接去查询想要的结果。...连接查询其实等同于连接查询,需要两张表,只不过它的左表(父表)和右表(子表)都是自己。做连接查询的时候,是自己和自己连接,分别给父表和子表取两个不同的别名,然后附上连接条件。...select s.id, s.cate_name, p.cate_name from tdb_cates s left join tdb_cates p on s.parent_id=p.id; 查询结果...select s.id, s.cate_name, p.cate_name from tdb_cates s left join tdb_cates p on p.parent_id=s.id; 查询结果

1.5K20

MySQLGTID和增列的数据测试(r12笔记第38天)

昨天的一篇文章MySQL增列主从不一致的测试(r12笔记第37天),今天有不少网友向我确认一些细节,我想最近正好在看GTID的东西,可以揉在一起来说说。...mysql> insert into t1 values(null,2);这个时候查看增列的情况如下,会逐步递增。...我们看看这个时候的增列值情况。...纠结的问题就是增列之为3,而Slave 1节点和Slave 2节点的增列值为5. mysql> show create table t1\G ***************************...这个时候再次查看增列的情况。这个步骤看起来复杂一些,其实就是新的从库会去接收应用在Slave 1节点上的数据变化,相当于在Master节点插入了一条记录,导致这个增列之继续增加

1.2K110

mysql已存在的表增加增字段

需求: 已有的mysql数据表,希望增加一个增的字段,并设置新数据的初始值。 实际上不复杂,只是做个备忘。...新数据的起始值 /*增加一个增主键字段,分两步操作*/ /*首先增加增字段*/ alter table t_abc add column id int auto_increment primary...key; /*执行完上面这一条,字段增加,但值为空*/ /*执行这一条,它会自动为已存在的数据的增字段赋初值,从1开始,同时将后续新增的数据从100开始*/ alter table t_abc auto_increment...1开始的初始值,其实隐含的设置当前表增字段从1开始*/ alter table t_abc auto_increment; /*将所有数据增加10000*/ update t_abc set id=...id+10000; /* 前面的100 我们是任意指定的,现在我们应该指定数据库的maxId+1作为下一个数据的起始值*/ set @maxId=1; select max(id) into @maxId

11K10

mysql创建临时表,将查询结果插入已有表

我记得学数据库理论课老师说可以创建临时表,不知道mysql有没有这样的功能呢?临时表在内存之中,读取速度应该比视图快一些。然后还需要将查询结果存储到临时表。...A、临时表再断开于mysql的连接后系统会自动删除临时表的数据,但是这只限于用下面语句建立的表: 1)定义字段   CREATE TEMPORARY TABLE tmp_table (      ...2)直接将查询结果导入临时表   CREATE TEMPORARY TABLE tmp_table SELECT * FROM table_name B、另外mysql也允许你在内存中直接创建临时表,...TABLE tmp_table (      name VARCHAR(10) NOT NULL,      value INTEGER NOT NULL   ) TYPE = HEAP 那如何将查询结果存入已有的表呢...1、可以使用A第二个方法 2、使用insert into temtable (select a,b,c,d from tablea)”;

9.8K50

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

MySQL增列问题其实很有意思,在重启数据库之后,会按照max(id)+1的方式来计算,这样一个看起来有些别扭的实现方式在早期版本就饱受诟病,在MySQL 5.7都没有解决掉,终于在8.0松口了...而重启会带来自增列一类的潜在问题,而如果不重启其实也有可能会有增列的不一致问题。和两个参数table_definition_cache和table_open_cache还是密切相关的。...,如果表太多而不能全部放在缓存的话,老的表就会被置换出来,这种被置换出来的表下次再使用的时候,就要重新打开一遍,对增列来说,这个过程就和实例重启类似,需要 select max(id) + 1 算一下增值...生成500个表,然后插入一条数据,修改自增列值,然后查询表里的数据,使得数据能够刷出,稍作等待,查看show create table的结果。...SHOW CREATE TABLE t$i; EOF done 测试完成之后,来查看增列的值情况.

1.4K40
领券