偶然看到了“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

转载于:https://www.cnblogs.com/L-H-R-X-hehe/p/4084390.html

MySQL中主键的选择与磁盘性能相关推荐

  1. Mysql中主键和外键和索引

    Mysql中主键和外键和索引 1.主键和外键是什么 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 课程表(课程编号,课程名,学分) 其中课程编号是唯一的,课程编号就是 ...

  2. 数据库中主键的选择和使用

    主键的选择: 1.有意义的键和无意义的键:    有意义的键:例如身份证号.键值是唯一的,而由人来指定是不可靠的,有可能会出现重复,虽然数据库可以检测出来,但是在数据进入系统之前不会被发现.所以有意义 ...

  3. mysql中主键的用法_MySQL中的主键以及设置其自增的用法教程

    1.声明主键的方法:您可以在创建表的时候就为表加上主键,如: CREATE TABLE tbl_name ([字段描述省略...], PRIMARY KEY(index_col_name)); 也可以 ...

  4. mysql中主键、普通索引、唯一索引和全文索引

    SQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个表的所有记录,直至找到符合要求的记录.表里面的记录 ...

  5. MySQL 中主键的几种表设计组合的实际应用效果

    了解主键.外键.索引 主键 主键的主要作用是保证表的完整.保证表数据行的唯一性质, ① 业务主键(自然主键):在数据库表中把具有业务逻辑含义的字段作为主键,称为"自然主键(Natural K ...

  6. MySQL中主键和unique的区别

    主键:primary key 能够唯一标识表中某一行的属性或属性组. 主键也是一个特殊的索引. ⼀个表可能有多个候选键,我们可以选择⼀个候选键作为表 的 主键 . ⼀个表最多只能有⼀个主键, 主键列不 ...

  7. 45 | MySQL中主键自增id达到上限?xid也能达到上限?trx_id也也可以到上限?

    一.前言 目前MySQL笔记先暂时学到一个段落了,接下来就是继续复习- 二.正文 1.rowid什么时候是非隐式可查询的?内部实现原理是什么?有什么问题? 当有主键.唯一键时 如果InnoDB 表没有 ...

  8. mysql中主键外键的作用_数据库主键和外键的作用以及索引的作用,它的优缺点是什么?...

    定义主键和外键主要是为了维护关系数据库的完整性,总结一下: 1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄. 身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证 ...

  9. mysql中主键约束和唯一约束的区别_主键约束和唯一性约束的区别

    1.主键约束(PRIMARY KEY) 1) 主键用于唯一地标识表中的每一条记录,可以定义一列或多列为主键. 2) 是不可能(或很难)更新. 3) 主键列上没有任何两行具有相同值(即重复值),不允许空 ...

最新文章

  1. 从两个bug来看Javascript的装载
  2. Python 学习日记 第八天
  3. S1 商品信息管理系统
  4. css 文字重叠_学习过CSS,那你知道BFC是什么吗?
  5. 从研究到应用:腾讯AI Lab的自然语言理解和生成
  6. “ModSecurity2”源码分析
  7. python字符串截取方法_如何使用python语言中的字符串方法截取字符串
  8. mysql connector cpp_MySQL Connector/C++(一)
  9. pytorch---之随机种子初始化
  10. 20172329《程序设计与数据结构》实验一:线性结构实验报告
  11. hibernate的hsql
  12. 堆排序(Heapsort)-全网最详细
  13. Unity 打开摄像头
  14. RSA算法计算d的两种方法。
  15. C++中的常成员函数以及const用于函数重载
  16. 33-Figma-数据采集器使用方式-后裔采集器
  17. linux静态链接库添加,c-静态链接库时,出现链接器错误:找不到-...
  18. Vue extends拓展任意组件功能(el-select实例)-两种写法
  19. 数据结构之二叉树遍历经典题目
  20. 计算机桌面任务栏跳到,电脑桌面任务栏跑到左边去了

热门文章

  1. 西浦与杭电计算机选哪个,四邮四电究竟谁强谁弱?哪三所大学报考更有性价比?...
  2. 管理服务器文件绿色版本,Services.msc服务器文件官方版
  3. php实时上传多张图片,PHP实现多张图片上传预览功能
  4. python minimize_Python数学规划案例一
  5. mybatis generator 打印出来表了 但是没有生成未见_Python丨深度学习中使用生成器加速数据读取与训练...
  6. java数组的扩容,将两个数组合并成一个数组
  7. Java中抽象类和接口的区别?
  8. 安装引导黑屏_给电脑安装系统老是装不上,重启就黑屏,原来是这项设置在作怪!...
  9. 计算机管理也无法运行,【两种解决方法】任务管理器打不开怎么办?
  10. ps efgrep mysql 命令_mysql常用管理命令