你设计的应用是IO依赖型还是CPU依赖型?
这个话题可能看起来非常枯燥,但它对mysql的性能优化非常重要。
其实我在MYSQL
咨询工作中无时无刻接不在接触这类问题。
IO工作负载与cpu依赖全然不同,尤其是当你的工作集(通常仅仅有数据库的一小部分)载入内存的时候。当数据在内存中时读取是很快的。假设不在内存中,则很缓慢。
比如。当你查询分析10000行数据时,假设这10000行所有载入在内存中,则仅仅须要很短时间;可是假设到磁盘上去读的话,我们假设仅仅有10%也就是仅仅须要1000次随机读操作的情况下,这个查询也要花费至少5到10秒,或者在已经超负荷的情况下可能花费很多其它的时间。
所以在设计应用的时候就应当考虑你的应用属于哪种类型?能否让应用充分利用CPU或者内存?假设是的话。那么不论什么种类的困难都不复存在。并且你也许能够採用更easy实现的解决方式。但当你设计CPU依赖型应用的时候要注意。当它规模过大时你可能负担不起更大的内存需求。同一时候性能还会急剧下降,并且随着复杂变化的发生你的应用訪问速度可能变得糟糕。
CPU依赖在处理大量数据时比IO依赖更有优势:Count查询,分组查询,无索引排序。搜索查询等。基本上查询分析超过100行数据并且是“随机訪问”大数据量的表(这种情况下,须要频繁的物理IO操作)我想强调的是,这种查询可能会遇到性能问题。
同一时候,也不要仅仅看“典型”案例,在非常多情况下性能方面的问题可能就是这最糟糕的5%导致的。
让我来举个简单的样例来说明一下。假设你的应用中用户之间有某种格式的通信。
您可能希望显示用户未读消息数以及邮箱中的邮件总数来至少“画出页面”,简单的解决方式是运行select count(*) from messages where user_id=134 语句或者在祝查询中使用SQL_CALC_FOUND_ROWS标记来查询相关数据。假设你的应用是CPU依赖型,那么你可能须要做的就是在数据库之上做一次缓存;假设你的应用为IO依赖型。那么你可能会有麻烦,即使邮箱中仅仅有1000条信息也会使速度变慢。
如果如今你有一部分很活跃的用户。他们的邮箱中邮件数可能许多。达到一个极端,那么载入这些信息将花费很长时间--产生的负载也比普通用户多。并且由于他们对整个应用的贡献很大所以你不想由于页面载入慢而激怒这部分用户。
所以,对于IO依赖型应用,你须要创建字段来记录信息总数、已读信息数等;须要确保同步更新这新字段(如使用触发器);确保全部查询使用order by ... limit语句索引。
对于IO依赖型应用来说。聚集索引(数据本地化)也是非常重要的--假设使用的是Innodb引擎的表。使用被auto_increment标记的自增列作索引非常可能比使用如(user_id,sub_id)这样的符合主键要慢,这是由于这样的索引能够将user_id同样的信息聚集起来并且通常同意通过非常少物理IO来查询这些数据。
你可能会觉得你在CPU依赖型设计场景中也会碰到这类问题--是的。可是你可能是在100,000条信息的时候遇到性能问题而不是像IO依赖型应用中在100条信息的时候就会碰到这个问题。而这100,000条对大多数应用来说已经够用了。不用去过多考虑这个问题。
1. 本文由程序猿学架构翻译
2. 本文译自Are you designing IO bound or CPU bound application ? | MySQL Performance Blog
3. 转载请务必注明本文出自:程序猿学架构(微信号:archleaner
)
4. 很多其它文章请扫码:
你设计的应用是IO依赖型还是CPU依赖型?的更多相关文章
- CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占
CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占
- erl0001-Erlang 设计原则 process port io
Erlang原理 (转载自ITEYE cryolite博客 ps:精彩)by Robert Virding This is a description of some of the basic pro ...
- 响应式设计工具网站mydevice.io
1.网址 https://mydevice.io/ 2.使用 在mydevice.io上有常见智能手机,PC电脑的尺寸.
- 《计算机组成与体系结构:性能设计》读后小记 12、CPU的结构和功能
一.CPU组成 1.组成: ALU:算术逻辑单元,完成数据的实际计算或处理 控制器:控制数据的移入移出CPU 寄存器:由一组存储位置极小的内部存储器组成 CPU内部总线:在各寄存器和ALU之间传送数据 ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-3.设备驱动的设计
目 录 第三章 设备驱动的设计... 2 3.1 初始化设备... 4 3.2 运行设备接口设计... 4 3.3 ...
- Java中 NIO与IO的区别
当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...
- io端口与io内存详解
(一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存.BIOS等).在程序指令中的虚拟地址 ...
- java nio 与io区别
转自:http://blog.csdn.net/keda8997110/article/details/19549493 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使 ...
- IO流02--毕向东JAVA基础教程视频学习笔记
提要 08 自定义装饰类09 LineNumberReader10 MyLineNumberReader11 字节流File读写操作12 拷贝图片13 字节流的缓冲区14 自定义字节流的缓冲区-rea ...
随机推荐
- int和Integer,String和String(包装类)
1.int和Integer的值如果是一样的,则是在内存中开辟相同的内存空间 2.但是String和String(包装类)是不一样的 代码演示: int a=1; Integer b = new Int ...
- iOS使用CoreData实现收藏功能
一般做收藏都是使用数据库或者归档,使用CoreData实现收藏功能就是没事时练一下,实现大概和数据库差不多. 首先创建一个工具类继承NSObject,在里面实现所需要的方法. 工具类的.h文件: ty ...
- B/S架构 Web打印程序(Argox)
B/S架构 Web打印程序 对于B/S架构下的管理软件系统,在客户端浏览器页面中如何透过本地打印机或网络打印机打印条码标签,Argox提供最常用的2种类型打印机集成方案. ● PPLA 打印机IE游 ...
- NHibernate官方文档中文版——持久化类(Persistent Classes)
持久化类是一个应用程序中的类,主要用来实现业务逻辑(例如,在电商应用中的客户和订单类).持久化类,就像它的名字一样,生命周期短暂并且用来持久化的据库对象实例. 如果这些类的构造能够依照一些简单的原则, ...
- 在WPF中合并两个ObservableCollection
WPF中的ObservableCollection是一个非常常用的集合对象,我们可以通过将它绑定到ListBox之类的集合控件上时,当集合发生变更时,会同步更新到界面上.但是,有的时候我们需要合并两个 ...
- 分布式架构高可用架构篇_activemq高可用集群(zookeeper+leveldb)安装、配置、高可用测试
原文:http://www.iteye.com/topic/1145651 从 ActiveMQ 5.9 开始,ActiveMQ 的集群实现方式取消了传统的Master-Slave 方式,增加了基于Z ...
- Windows 2008 R2
1简介 Windows 2008 R2是微软针对windows 7所推出的Windows server操作系统.为了使企业减少操作成本和提高效率,Windows Server 2008 R2对企业资源 ...
- JNI之——在cmd命令行下编译执行C/C++源文件
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46604269 一直用java来敲代码,java配置好jre路径之后.在cmd下编译 ...
- ACboy needs your help-分组背包模板题
id=17676" target="_blank" style="color:blue; text-decoration:none">ACboy ...
- Windows下搭建基于SSH的Git服务器
Git客户端安装 客户端要同时安装在远程服务器和自己的电脑上,下载地址:http://msysgit.github.io/ 选择安装组件 :也可以默认选择; 图标组件(Addition icons) ...