`
tower
  • 浏览: 243790 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

innodb 存储引擎为什么要用一个自增的主键呢?

 
阅读更多


 innodb 存储引擎为什么要用一个自增的主键呢?
 
我们来看看innodb的存储,
 
 
每个表在磁盘上,是单独的一个文件。索引和数据都在其中,文件是按照主键索引组织的一个B+TREE结构。
 

 
 
因为B+TREE是有序的一个数据结构,所以从效率的角度,主键最好也是一个有序的,这样可以有效的防止B+TREE的不断分裂调整。同时也保证了按照时间顺序进去的数据在存储上也是一个相对顺序的存放。这个不仅对insert,同时对有时间条件的范围查询,也能大大提高效率。
 
同时mysql 5.1后,对自增的主键的优化也有很多。
 
这种按照索引组织数据的方式,简称IOT,还有一种方式,叫heap table,堆表。
 
这个问题,我发现有两种人特别容易采坑:
1、从Oralce转过来使用MySQL的人。因为Oracle是heap table 和 IOT都实现了,而且默认是按照heap table的方式进行存储。
2、Hibernate的重度使用者。很多早期的Hibernate教程,会建议为了移植数据库方便,会建议主键使用UUID
 
所以,innodb下的表,如果有足够的数据量,毫不怀疑的加一个自增主键。存量系统需要改造的话,在原表上加一个自增主键,原表的主键改成一个唯一索引降格为Secondary Index即可。
 

 

  • 大小: 18.5 KB
  • 大小: 87.6 KB
分享到:
评论

相关推荐

    为什么说InnoDB必须要有主键并且推荐使用自增整型主键呢?

    这里我们深入探讨为什么InnoDB必须要有主键,以及为什么推荐使用自增整型主键。 首先,InnoDB存储引擎依赖于主键来构建其内部的数据结构,即B+Tree。B+Tree是一种高效的数据索引结构,它允许快速查找、插入和删除...

    自增主键为什么不是连续的?.pdf

    在数据库设计中,自增主键(Auto Increment Primary Key)是一种常见的策略,用于为每条新插入的记录生成唯一的标识符。然而,自增主键并不总是连续的,这主要与数据库管理系统(如MySQL)如何处理自增值以及自增值...

    MySQL8新特性:自增主键的持久化详解

    MySQL 8.0引入的新特性之一是自增主键的持久化,这主要是为了解决一个长期存在的问题,即自增主键计数器在数据库重启后无法保持其状态。在旧版本的MySQL中,自增主键的值是通过InnoDB数据字典中的内存计数器来管理的...

    使用prometheus统计MySQL自增主键的剩余可用百分比

    在这个场景中,我们关注的是如何使用Prometheus来统计MySQL自增主键的剩余可用百分比,以预防生产环境中可能出现的主键溢出问题。 MySQL自增主键是数据库表中一种常见的标识符,它会自动递增以确保每个记录的唯一性...

    MySQL经典面试题29道

    1、为什么要尽量设定一个主键? 主键是数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键。 设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作...

    MyISAM和InnoDB索引引擎的B+树索引实现1

    相比之下,InnoDB存储引擎采用了不同的策略。InnoDB的索引是聚集索引,这意味着数据行本身与主键索引的叶节点是合并存储的,数据文件本身就是按主键组织的B+树。这样,对于主键查询,InnoDB可以直接在索引中获取完整...

    mysql储存相关的面试题目精选

    3、InnoDB 为何推荐使用自增主键? 自增 ID 可以保证每次插入时 B+ 树索引是从右边扩展的,因此相比自定义 ID (如 UUID)可以避免 B+ 树的频繁合并和分裂。如果使用字符串主键和随机主键,会使得数据随机插入,效率...

    mysql自增字段重排 mysql删除表后自增字段从1开始.pdf

    - 当创建一个带有AUTO_INCREMENT属性的表时,可以使用`AUTO_INCREMENT=n`选项指定自增字段的初始值。 - 对于已存在的表,可以使用`ALTER TABLE table_name AUTO_INCREMENT=n`命令来更改自增字段的起始值。 2. **...

    MySQL Innodb 索引原理详解

    - 当一个节点满时,如果它的下一个兄弟节点未满,则将一部分数据移动到兄弟节点中,再在原节点插入关键字,最后修改父节点中兄弟节点的关键字;如果兄弟节点也满了,则在原节点与兄弟节点之间增加新节点,并各复制1/...

    mysql innodb引擎 知识点总结

    7. **自增ID**:InnoDB表有一个特殊的内置列,即自动增长列(通常为主键),每次插入新行时,该列的值会自动递增。 8. **redo log**:redo日志用于记录事务中的更改,确保在系统崩溃时能恢复到一致性状态。它是...

    InnoDB 中文参考手册(CHM)

    《InnoDB 中文参考手册》是一本专门为数据库管理员和开发者准备的详尽指南,专注于MySQL数据库系统中的InnoDB存储引擎。InnoDB是MySQL中最常用的存储引擎之一,以其强大的事务处理能力、行级锁定机制和对ACID(原子...

    MySQL InnoDB存储引擎的深入探秘

    当一个事务想要获得行级共享锁或排他锁时,它首先会尝试获取对应的意向锁。这样,如果其他事务持有表级别的意向锁,就能够在检查阶段避免不必要的行级锁定冲突。 记录锁记录锁是InnoDB存储引擎实现的最基础的行级锁...

    MySQLjsnm-InnoDBccyq_InnoDB_MYSQL_

    MySQL数据库是世界上最受欢迎的关系型数据库管理系统之一,而InnoDB存储引擎是其最常用的事务处理引擎。InnoDB以其强大的性能、高可用性和数据一致性保障而备受赞誉。本资料集"MySQLjsnm-InnoDBccyq_InnoDB_MYSQL_...

    MySQL的自增ID(主键) 用完了的解决方法

    如果在创建表时未显式定义主键,InnoDB存储引擎会自动创建一个6字节的不可见主键`row_id`,基于`BIGINT UNSIGNED`,但实际只使用了48位,这可能导致在特定情况下出现主键冲突。 4. **主键冲突处理**: - 当全局`...

    Java后端工程类面试宝典.pdf

    使用自增列作为主键是因为InnoDB存储引擎会将自增列作为聚集索引,聚集索引的叶节点存储了行记录。自增主键的插入可以顺序地进行,避免了页分裂,从而提高了数据插入的效率。如果使用非自增主键,可能会因为主键的...

    mysql自增字段重排 mysql删除表后自增字段从1开始.docx

    总的来说,理解MySQL中不同存储引擎对自增字段的处理方式非常重要,这有助于我们在设计数据库时做出最佳选择,尤其是在处理大量数据和频繁的插入、删除操作时。正确地管理和调整自增字段可以确保数据的一致性和高效...

    04深入浅出索引(上).pptx

    本篇将深入讲解索引的概念,以InnoDB存储引擎为例,探讨其独特的索引模型,并分析如何优化索引使用以提升性能。 首先,创建一个名为T的表,包含三个字段:id(整型,主键)、k(整型,非空)和name(可变字符型,...

Global site tag (gtag.js) - Google Analytics