偶然看到了“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联合主键,这样既保证了写操作的效率,也保证了读操作的效率

转自:http://hi.baidu.com/thinkinginla ... d21b01b3de0580.html

MySQL中主键的选择与磁盘性能的更多相关文章

  1. 【数据库】Mysql中主键的几种表设计组合的实际应用效果

    写在前面 前前后后忙忙碌碌,度过了新工作的三个月.博客许久未新,似乎对忙碌没有一点点防备.总结下来三个月不断的磨砺自己,努力从独乐乐转变到众乐乐,体会到不一样的是,连办公室的新玩意都能引起莫名的兴趣了 ...

  2. mySQL 中主键值自动增加

    转  http://stevenjohn.iteye.com/blog/976397 MySql 主键自动增长 博客分类: DataBase MySQLSQL  创建数据库,创建表. mysql> ...

  3. Mysql中主键与索引

    摘自: https://www.cnblogs.com/wicub/p/5898286.html 一.什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没 ...

  4. MySQL中主键id不连贯重置处理办法

    MySQL中有时候会出现主键字段不连续,或者顺序乱了,想重置从1开始自增,下面处理方法 先删除原有主键,再新增新主键字段就好了 #删除原有自增主键 ALTER TABLE appraiser_info ...

  5. mysql中主键和唯一键的区别

    区别项 primary key(主键) unique(唯一键约束) 唯一性 可以 可以 是否可以为空 不可以 可以 允许个数 只能有1个 允许多个 是否允许多列组合 允许 允许

  6. mysql insert插入时实现如果数据表中主键重复则更新,没有重复则插入的四种方法

    [CSDN下载] Powerdesigner 设计主键code不能重复等问题 [CSDN博客] Oracle中用一个序列给两个表创建主键自增功能的后果 [CSDN博客] MySQL自增主键删除后重复问 ...

  7. Mybatis「MySQL-Oracle」 中主键自动生成 <selectKey> 序列化

    有时候我们不仅仅是通过返回 int 影响行数来确定数据是否插入成功就行了,因为我们总是会用到这个刚刚插入的自增主键,比如主子表入库,子表需要主表的 id,那这个时候我们再去数据库查就显得有点 low ...

  8. 图解|12张图告诉你MySQL的主键查询为什么这么快

    这是图解MySQL的第3篇文章,这篇文章会让大家清楚地明白: 什么是InnoDB行格式?InnoDB页是什么? InnoDB页和InnoDB行格式都有哪些字段信息? 为什么推荐使用自增ID作为主键,而 ...

  9. MyBatis中主键回填的两种实现方式

    主键回填其实是一个非常常见的需求,特别是在数据添加的过程中,我们经常需要添加完数据之后,需要获取刚刚添加的数据 id,无论是 Jdbc 还是各种各样的数据库框架都对此提供了相关的支持,本文我就来和和大 ...

随机推荐

  1. 记:SpringBoot项目莫名出现ClassNotFoundException

    最近某个开发环境的某个应用,隔三差五出现了某某页面找不到,网上百度找了些同类的问题都是说jstl包与默认tomcat里的包冲突,但都感觉和我的问题不是很搭配(因为相同框架的其他项目都可以正常允许) 报 ...

  2. PTA (Advanced Level)1077.Kuchiguse

    The Japanese language is notorious for its sentence ending particles. Personal preference of such pa ...

  3. [转帖]12条用于Linux的MySQL/MariaDB安全最佳实践

    12条用于Linux的MySQL/MariaDB安全最佳实践 2018-01-04 11:05:56作者:凉凉_,soaring稿源:开源中国社区 https://ywnz.com/linuxysjk ...

  4. 【Python】【demo实验28】【练习实例】【递归函数练习】

    原题: 有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后问第一个人,他说是10岁.请 ...

  5. DOS cscript

    C:\>cscript /?Microsoft (R) Windows Script Host Version 5.812版权所有(C) Microsoft Corporation.保留所有权利 ...

  6. PAT A1001 A+B Format (20 分)

    AC代码 #include <cstdio> #include <algorithm> using namespace std; const int maxn = 11; in ...

  7. # [洛谷1337] 吊打XXX/平衡点 (模拟退火)

    [洛谷1337] 吊打XXX/平衡点 (模拟退火) 题意 n个重物(x,y,w),求平衡时x的位置(x,y) 分析 模拟退火基础题,基于随机数的优化算法,时间复杂度玄学,参数玄学,能不能AC看脸,当然 ...

  8. win7安装mongodb3.6

    1. 下载 https://www.mongodb.com/download-center/enterprise 选择合适平台点击下载 2. 安装mongodb 在win7系统安装mongodb需要v ...

  9. DashBoard-身份验证

    dashboard1.7.1版本之后,新增了用户登录认证的功能. 默认dashboard会跳转到登录页面: 我们可以看到dashboard提供了Kubeconfig和token两种登录方式,我们可以直 ...

  10. CSS 小工具集

    http://www.colorzilla.com/gradient-editor/css渐变生成工具.http://linxz.github.io/tianyizone/css志爷小工具.http: ...