本文作者:kris

MySQL中InnoDB存储引擎的锁的基本使用教程-mysql innodb存储引擎

kris 2025-01-25 08:06:04 5
MySQL中InnoDB存储引擎的锁的基本使用教程-mysql innodb存储引擎摘要: mysql的innodb存储引擎下,主键默认是按照自增的顺序排的吗?默认楼主使用的是InnoDB存储引擎尽量使用业务无关的自增列作为主键,主要原因:1. InnoDB数据是按照主键...

mysql的innodb存储引擎下,主键默认是按照自增的顺序排的吗?

默认楼主使用的是InnoDB存储引擎尽量使用业务无关的自增列作为主键,主要原因:

1. InnoDB数据是按照主键聚簇的,数据在物理上按照主键大小顺序存储,使用其他列或者组合无法保证顺序插入,随机IO(SSD的话影响不大)导致插入性能下降2.所有二级索引都存储了主键的,采用二级索引查询,首先找到的主键,然后通过主键定位数据,如果直接使用组合字段作为主键,会导致二级索引占用空间较大,bufferpool中存储的记录数较少,影响性能,而自增列只占4或者8个字节,代价非常小

MySQL数据库设计之innodb如何设计主键索引?

MySQL数据库分为两种存储引擎MyISAM引擎与InnoDB。其中最主要区别在于InnoDB是聚集索引而MyISAM是非聚集索引。想要知道如何设计lnnoDB主键索引,我们则需要先理解其索引是如何实现才能进行合理有效的设计。

MySQL中InnoDB存储引擎的锁的基本使用教程-mysql innodb存储引擎



InnoDB索引实现

InnoDB使用B+Tree作为索引结构,数据文件本身就是索引文件。在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。

MySQL中InnoDB存储引擎的锁的基本使用教程-mysql innodb存储引擎

上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录如子叶数据文件就可以理解为索引文件,15为key主键,这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

其次,InnoDB的辅助索引data域存储的是主键的值而不是地址。既InnoDB的所有辅助索引都引用主键作为data域。例如,下图子叶中辅助索引Alice的data存的是主键的值

MySQL中InnoDB存储引擎的锁的基本使用教程-mysql innodb存储引擎

所以当使用辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。


设计的思路

在InnoDB的索引实现后我们就可以根据其特性作出相应的设计了,如

  • 不使用过长的字段作为主键,因为所有辅助索引都引用了主索引,过长的主索引会令辅助索引变得过大。
  • 不使用非唯一的字段作为主键在InnoDB,因为InnoDB数据文件本身是一颗B+Tree,非唯一主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,使用自增字段作为主键则是一个不错的方式。

以上就是如何设计InnoDB主键索引的方式,思路是设计先要去理解其原理,在理解其原理之后根据其特性结合实际场景业务等即可以做出对应合理设计,希望我的回答对你有所帮助。

文章版权及转载声明

作者:kris本文地址:https://www.damoyx.com/p/27282.html发布于 2025-01-25 08:06:04
文章转载或复制请以超链接形式并注明出处大漠游侠网

阅读
分享