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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python找钱_python 递归 找零钱

首先回答你的问题 count 1 coins_changeREC(coin_values, change-value)#1.when reached here, one recursion link ends if count < min_count: min_count count #2. update the minimum count of coins 每次走到注释1的地方的时候&#xff0c;对于一个coin_value开始的…

qt 等待线程结束_c – 停止Qt线程:调用exit()或quit()不会停止线程执行

在main()即主线程中创建了一个QThread.将一个worker类移动到新线程.该线程执行worker类的’StartThread’方法.工人线程&#xff1a;//header fileclass Worker : public QObject{Q_OBJECTpublic:Worker(QThread* thread);public slots:void StartThread();void EndThread();pr…

rcnn spp_net hcp

rcnn开创性工作&#xff0c;但是计算时间太长&#xff0c;重复计算太大。 spp_net将重复计算避免了。 hcp是yan shuicheng那边的&#xff0c;是用bing生成regions&#xff0c;然后用normalized cut将这些regions进行聚类&#xff0c;然后将聚类后剩下较小数量的regions进cnn&am…

eslint语法报错解决

今天将之前一个项目加入了eslint&#xff0c;发现很多变报错&#xff0c;但是反复检查自己代码是没有错误的&#xff0c;根据报错信息可知是某些api在eslint语法中使用不规范导致&#xff0c;大概总结如下&#xff1a; 1.setup中接收props 报错&#xff1a;Getting a value f…

MediaRecorder录像怎么旋转呀?

问题描述最近做的项目摄像头是跟手机按90度安装的&#xff0c;用MediaRecorder录像还是按摄像头的方向而不是手机的方向&#xff0c;录出来的是90度旋转的&#xff0c;试了很多方法都不管用。MediaRecorder.setOrientationHint没有效果&#xff0c;在底层AuthorDriver那都没有对…

简述python定义中的五个要点_Python基础知识复习

1.切片操作三个参数的意义&#xff1a;切片是Python序列的重要操作之一&#xff0c;适用于列表、元组、字符串、range对象等类型。切片使用2个冒号分隔的3个数字来完成&#xff0c;第一个数字表示切片开始位置(默认为0)&#xff0c;第二个数字表示切片截止(但不包含)位置(默认为…

matlab畸变校正代码_关于OpenCV中的去畸变

在opencv中&#xff0c;有关图像或像素点&#xff08;角点&#xff09;去畸变的函数有cv::undistort()&#xff0c;cv::getOptimalNewCameraMatrix()&#xff0c;cv::initUndistortRectifyMap()&#xff0c;remap()&#xff0c;cv::undistortPoints()。其中undistort可以直接对…

redis数据库简介、redis下载及安装(win64位)、node操作redis、redis实现短信校验注册接口

redis简介&#xff1a; 1:内存数据库,同时也能够保存数据到磁盘&#xff1b; 2:比其他的内存数据库有着更多的数据类型&#xff1a; 列表,集合,排序集合,哈希表等; 3:主从结构&#xff1a;数据可以备份到从服务器&#xff1b; 4: Redis数据操作速度快; 5:所有的操作都是原…

go func()和 go_Go的泛型真的要来了—如何使用以及它们是怎么工作的

点击上方蓝色“Go语言中文网”关注我们&#xff0c;领全套Go资料&#xff0c;每天学习 Go 语言你没看错&#xff0c;这里讲的就是 Go 中的泛型。只不过还没有正式发布&#xff0c;是基于草案设计的&#xff0c;已经是实现了可运行的版本。所以&#xff0c;泛型到来真的不远了&a…

bios设置_bios怎么设置显存 bios设置显存教程【图文】

有些用户可能会发现打开电脑系统信息窗口显示的内存容量与实际容量不同&#xff0c;例如系统内存显示4G&#xff0c;可用3.73G。那么不可用的那部分内存到哪里去了呢?其实是被集成显卡占用当做显存使用了。下面我们就通过 bios设置显存 来调整占用内存容量的大小&#xff0c;我…

4变形物体_Houdini基础(二)曲线变形物体

设想&#xff1a;先从二维上来看直角坐标系。物体是由x&#xff0c;y两个轴向的数据组成的。少了其中一组数据物体就只能是分布在单一轴向上的点。单独保留物体x、y情况下的点分布情况现在将x、y加起来&#xff0c;可见在三维空间中形成了一个平面。仅有x、y坐标的物体从目前的…

node.js+mysql实现分库分表存查数据:

node.jsmysql实现分库分表&#xff1a; 1.分库分表使用场景&#xff1a; 互联网项目中常用到的关系型数据库&#xff0c;如MySQL&#xff0c;随着用户和业务的增长&#xff0c;传统的单库单表模式难以满足大量的业务数据存储以及查询&#xff0c;单库单表中大量的数据会使写入…

Linux 添加新硬盘

1.识别分区和硬盘 在 /dev/ 目录下找到新的硬盘&#xff0c;sda 为本地硬盘&#xff0c;sda1、sda2.. 为分区&#xff0c;sdb 就是新添加的硬盘&#xff0c;如: [rootwusuyuan ~]# ls -ltr /dev/sd*brw-rw----. 1 root disk 8, 0 11月 14 14:12 /dev/sdabrw-rw----. 1 root di…

mybatis 映射成多个list_SSM:Mybatis架构与原理

MyBatis功能架构设计功能架构讲解&#xff1a;我们把Mybatis的功能架构分为三层&#xff1a;API接口层&#xff1a;提供给外部使用的接口API&#xff0c;开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。数据处理层&…

10无法勾选隐藏的项目_Excel超好用的隐藏操作,不可多得

日常工作中&#xff0c;表格数据的展示与隐藏也是有大学问的&#xff0c;为了表格更加简洁明了、美观大气&#xff0c;实用的隐藏技巧就派上用场了。且听小翼慢慢分享~1、隐藏行列方法1&#xff1a;选中目标区域&#xff0c;右击鼠标选择“隐藏”即可。如图&#xff1a;方法2&a…

python程序题斐波那契数列_Python编程题9--斐波那契数列

题目1 已知一个数列&#xff1a;1、1、2、3、5、8、13、……&#xff0c;其规律为从第3项开始&#xff0c;每一项都等于其前两项的和&#xff0c;这个数列就是斐波那契数列。 请求出符合斐波那契数列规律的第11项。 代码实现--非递归 def fib_show(n): a, b 0, 1 while n >…

cocos2d-x,求世界坐标

老版: http://user.qzone.qq.com/350479720/blog/1384483239 一&#xff0c;求node的世界坐标。因为node的contentSize为0&#xff0c;局部坐标原点与node重合。所以求起来简单。下面方法都对&#xff1a;1&#xff0c;node->getParent()->convertToWorldSpace(node->…

pdf会签_跟我们做流程管理.pdf

跟我们做流程管理跟我们做流程管理——向管理要效益讲师简介陈立云 先生• AMT 高级咨询经理& 专家讲师• 暨南大学管理学院MBA教育中心校外导师• 著有畅销书 《跟我们做流程管理》&#xff0c;得到用户广泛好评• 曾先后在华为技术、美的电器、佳杰科技担任流程管理专家/…

python爬虫知乎图片_python爬虫(爬取知乎答案图片)

python爬虫&#xff08;爬取知乎答案图片&#xff09; 1.⾸先&#xff0c;你要在电脑⾥安装 python 的环境 我会提供2.7和3.6两个版本的代码,但是本⽂只以python3.6版本为例。 安装完成后&#xff0c;打开你电脑的终端&#xff08;Terminal&#xff09;执⾏以下命令&#xff1a…

HTML5简略介绍

今天要说下 HTML5特有的一个元素 canvas &#xff0c;旨在让web页面上作矢量图不需要在依靠flash或是其他插件&#xff0c;在网页上使用canvas元素时&#xff0c;它会创建一块矩形区域&#xff0c;默认300*150&#xff0c;当然也是可以自定义的。Canvas中的坐标是从左上角开始的…