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 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大 ...
随机推荐
- readline安装
wget -c ftp://ftp.gnu.org/gnu/readline/readline-6.2.tar.gz tar -zxvf readline-6.2.tar.gz cd readline ...
- ABC044 Digit Sum
题目链接 我的思路略复杂,这里介绍一个比较简洁的做法. 对于 $b \le \sqrt{N}$,暴力枚举 $b$.对于 $b > \sqrt{N}$, 注意到在 $b$ 进制下 $N$ 至多有 ...
- 一些基础的python小程序
1.求下列数奇偶分数: list1 = [1,2,3,4,5,6,7,8,9,10] # 先创建两个空列表 jishu = [] oushu = [] # 使用for循环迭代list1一一取出进行判断 ...
- Elastic Search 分布式架构分析
1 ES分布式机制的透明隐藏特性ES本身就是一个分布式系统,就是为了处理海量数据的应用.ES隐藏了复杂的分布式机制,简化了配置和操作的复杂度.ES在现在的互联网环境中,盛行的原因,主要的核心就是分布式 ...
- mysql之存储过程基础
存储过程 procedure 可以理解为一个处理增删改,没有返回值得函数 创建存储过程的基本语法 create procedure 过程名 ([参数列表]) begin --过程体 end 存储过程主 ...
- http请求之of_ordering_http_post
//Public function of_ordering_http_post (string as_vipsj,string as_url) returns string //string as_v ...
- Jmeter之TCP取样器
1.在线程组中添加“TCP取样器” 2.填写数据 以下截图是必须配置的 TCPClient classname: 填写TCP报文格式(有三类),默认前缀:org.apache.jmeter.prot ...
- Spring 配置文件注入
一.Spring配置文件注入 package com.zxguan.demo; public class Person { private String name; private int age; ...
- 使用SSH连接AWS服务器
使用SSH连接AWS服务器 一直有一台AWS云主机,但是之前在Windows平台都是使用Xshell连接的,换到Ubuntu环境之后还没有试,昨天试了一下,终于使用SSH连接成功了,这里记录一下步骤: ...
- js获取图片信息
网络图片: fetch(item.path).then(function(res){ // 计算图片大小 return res.blob() }).then(function(data){ conso ...



