MySQL中主键的选择与磁盘性能
| 偶然看到了“Fotolog: Scaling the World\'s Largest Photo Blogging Community”,才发现很多数据库的优化其实道理都很简单,至高境界是当你面对问题时,是否真正做出了自己的思考,而不仅仅只是经验主义的惯性使然:
本文案例背景介绍:一个图片网站,每张图片都有很多评论。浏览时会执行:SELECT ... FROM ... WHERE photo_identifier = ... ORDER BY posted ... 在“Old Schema”的解决方案中,一切都显得中规中矩:使用了最常见的自增字段identifier作为主键,同时使用photo_identifier, posted作为索引。
数据按照主键进行排序,当执行查询时,根据索引进行数据对位。不过这里的问题在于,同一个图片的评论数据,在磁盘上会分散到多个数据页之上。这也就意味着在查询这些数据的时候,磁盘要不断的调整数据定位。这是一个不小的IO开销。
在“New Schema”的解决方案中,虽然也使用了自增字段,但是采用的是联合主键photo_identifier, posted,identifier,并把identifier作为索引。同时需要注意的是,表类型使用的是Innodb,并缩减了自增字段的长度,这 样,主键的长度会短一些,有助于提升Innodb的性能。
数据按照联合主键进行排序,由于photo_identifier字段是联合主键中的第一个字段,所以对于一张图片而言,它所有的评论都保存在磁盘中相邻 的位置上。在这种情况下,当对数据进行定位时,Innodb会进行优化:“Pending read”,所谓Pendingread,指的是当发生一次read的时候,并不一定是直接从文件系统里“物理read”,而只是从缓冲池中“逻辑 read”,Innodb内部的优化机制可以合并多次“逻辑read”为一次“物理read”,从而降低IO消耗,提高磁盘性能。
还有一个问题要考虑,使用photo_identifier, posted,identifier联合主键时,如果对一个“旧图片”(photo_identifier较小的图片)发表评论的时候,数据会记录在比较 靠前的数据页上(因为数据在硬盘上保存的物理顺序是按主键排序的),和直接使用identifier自增主键相比,这样会引起一个不小的IO负担,因为自 增主键在添加新数据时,新数据始终位于数据文件的结尾。所以,实际应用中,文中所示的方法是否可用,还要从客观情况分析而定,比如说评论主要集中在“新图 片”上,则IO问题不大,因为“新图片”的记录位于数据文件靠后的位置上,但是如果评论分布的图片比较随机的话,那么此方法是否适用则需要斟酌,不过也可 以变通着来,比如说在主从服务器的结构里,我们可以在主服务器上使用identifier自增主键,在从服务器上使用 photo_identifier,posted, identifier联合主键,这样既保证了写操作的效率,也保证了读操作的效率 |
MySQL中主键的选择与磁盘性能的更多相关文章
- 【数据库】Mysql中主键的几种表设计组合的实际应用效果
写在前面 前前后后忙忙碌碌,度过了新工作的三个月.博客许久未新,似乎对忙碌没有一点点防备.总结下来三个月不断的磨砺自己,努力从独乐乐转变到众乐乐,体会到不一样的是,连办公室的新玩意都能引起莫名的兴趣了 ...
- mySQL 中主键值自动增加
转 http://stevenjohn.iteye.com/blog/976397 MySql 主键自动增长 博客分类: DataBase MySQLSQL 创建数据库,创建表. mysql> ...
- Mysql中主键与索引
摘自: https://www.cnblogs.com/wicub/p/5898286.html 一.什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没 ...
- MySQL中主键id不连贯重置处理办法
MySQL中有时候会出现主键字段不连续,或者顺序乱了,想重置从1开始自增,下面处理方法 先删除原有主键,再新增新主键字段就好了 #删除原有自增主键 ALTER TABLE appraiser_info ...
- mysql中主键和唯一键的区别
区别项 primary key(主键) unique(唯一键约束) 唯一性 可以 可以 是否可以为空 不可以 可以 允许个数 只能有1个 允许多个 是否允许多列组合 允许 允许
- mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法
[CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...
- Mybatis「MySQL-Oracle」 中主键自动生成 <selectKey> 序列化
有时候我们不仅仅是通过返回 int 影响行数来确定数据是否插入成功就行了,因为我们总是会用到这个刚刚插入的自增主键,比如主子表入库,子表需要主表的 id,那这个时候我们再去数据库查就显得有点 low ...
- 图解|12张图告诉你MySQL的主键查询为什么这么快
这是图解MySQL的第3篇文章,这篇文章会让大家清楚地明白: 什么是InnoDB行格式?InnoDB页是什么? InnoDB页和InnoDB行格式都有哪些字段信息? 为什么推荐使用自增ID作为主键,而 ...
- MyBatis中主键回填的两种实现方式
主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大 ...
随机推荐
- ZOJ Problem Set - 1003
1.翻译参考 http://www.cnblogs.com/woodfish1988/archive/2006/11/10/556926.html 2.代码参考 http://www.cnblogs. ...
- Spring系列七:Spring 自动装配
相思相见知何日?此时此夜难为情. 概述 在Spring框架中,在配置文件中声明bean的依赖关系是一个很好的做法,因为Spring容器能够自动装配协作bean之间的关系.这称为spring自动装配. ...
- FFmpeg4.0笔记:封装ffmpeg的解封装功能类CDemux
Github https://github.com/gongluck/FFmpeg4.0-study/tree/master/Cff CDemux.h /*********************** ...
- 关于vs code文本编辑器的快捷键
另一篇编辑器Sublime Text下载.使用教程.插件推荐说明.全套快捷键 基础编辑 快捷键 作用 Ctrl+X 剪切 Ctrl+C 复制 Ctrl+Shift+K 删除当前行 Ctrl+Enter ...
- 使用logstash从Kafka中拉取数据并传输给elasticsearch且创建相应索引的操作
注意事项:默认Kafka传递给elastci的数据是在'data'字段,且不包含其他数据,所以需要使用额外的操作进行处理 logstash配置文件操作 input { kafka { bootstra ...
- mysql创建表空间和用户
创建表空间名 create database 空间名 default character set utf8 collate utf8_bin; 创建用户create user 用户名 identifi ...
- Pytorch中nn.Conv2d的用法
Pytorch中nn.Conv2d的用法 nn.Conv2d是二维卷积方法,相对应的还有一维卷积方法nn.Conv1d,常用于文本数据的处理,而nn.Conv2d一般用于二维图像. 先看一下接口定义: ...
- 1、传统身份验证和JWT的身份验证
1.传统身份验证和JWT的身份验证 传统身份验证: HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过 ...
- 关于mysql事务的几件小事
零.MyISAM和InnoDB关于锁的区别 ①MyISAM默认用的是表级锁,不支持行级锁. ②InnoDB默认用的是行级锁,也支持表级锁. ③共享锁和排它锁的兼容性 |X|排它锁|共享锁| -|-|- ...
- 正着打星星(js)
//让用户输入行数,使用for循环嵌套打出正着的星星来,行数等于用户输入的数字 //例如:用户输入6 // * // *** // ***** // ******* // ********* // * ...



