你设计的应用是IO依赖型还是CPU依赖型?

这个话题可能看起来很枯燥,但它对mysql的性能优化非常重要。事实上我在MYSQL
咨询工作中无时无刻接不在接触这类问题。

IO工作负载与cpu依赖完全不同,尤其是当你的工作集(通常只有数据库的一小部分)载入内存的时候。当数据在内存中时读取是非常快的,如果不在内存中,则非常缓慢。例如,当你查询分析10000行数据时,如果这10000行全部加载在内存中,则只需要很短时间;但是如果到磁盘上去读的话,我们假设只有10%也就是只需要1000次随机读操作的情况下,这个查询也要花费至少5到10秒,或者在已经超负荷的情况下可能花费更多的时间。

所以在设计应用的时候就应当考虑你的应用属于哪种类型?是否能让应用充分利用CPU或者内存?如果是的话,那么任何种类的困难都不复存在,而且你或许可以采用更容易实现的解决方案。但当你设计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. 更多文章请扫码:

时间: 2024-08-12 09:30:24

你设计的应用是IO依赖型还是CPU依赖型?的相关文章

Erlang 设计原则 process port io

Erlang原理 (转载自ITEYE cryolite博客 ps:精彩)by Robert Virding This is a description of some of the basic properties and features of Erlang and an attempt to describe the rationale behind them. Erlang grew as we better understood the original problem we were

数据库 IO密集型 与 CPU密集型

1.IO密集型: 数据库仅提供建立的查询插入等操作,复杂的业务逻辑依赖与程序的实现,需要程序与数据库的频繁交互 2.CPU密集型: 一些复杂的逻辑计算可以在数据库中进行处理,可以依赖与数据库端的存储过程,触发器等功能,减少了程序代码与数据库的交互,减轻访问数据 库带来的IO压力,对于装备有高速磁盘阵列的服务器来说,可以实现CPU密集型 对于目前,高并发,数据量大的动态网站来说,数据库应该为IO密集型. http://blog.chinaunix.net/uid-116213-id-3086203

mysql性能调优与架构设计笔记

1.mysql基本介绍 mysql支持多线程高并发的关系型数据库; 数据库存储引擎InnoDB.MyISAM; mysql快速崛起的原因就是他是开源的; 性能一直是mysql自豪的一大特点; 2.mysql架构组成 麻雀虽小五脏俱全,mysql虽然简单但其内部结构并不简单; mysql物理文件组成之日志文件: 错误日志error log这里记录mysql运行时严重的警告和错误,以及mysql启动和关闭的日志信息 二进制日志 binary log 记录mysql运行时所有的query和query执

[转载] Java NIO与IO

原文地址:http://tutorials.jenkov.com/java-nio/nio-vs-io.html 作者:Jakob Jenkov   译者:郭蕾    校对:方腾飞 当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代码设计. Java NIO和IO的主要区别 下表总结了Java NIO和IO之间的主要差别,我会更详细地描述表中每部分

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动)

20150222 IO端口映射和IO内存映射(详解S3C24XX_GPIO驱动) 2015-02-22 李海沿 刚刚我们实现了linux系统内存的分配,读写,释放功能,下面,我们一鼓作气将IO端口映射及IO内存映射搞定,加油! (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义.物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上(如显存.BIOS等).在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址

IO和NIO的区别

java NIO和IO的主要区别是: IO                NIO 面向流            面向缓冲 阻塞IO           非阻塞IO 无 选择器 IO是为每一次连接创建一个线程,当并发数量非常大的时候,线程所占用的栈内存和cup线程切换的开销非常大,而NIO不在是为每个线程创建单独的线程,而是缓冲区,缓存了一定数量的线程. 面向流与面向缓冲 Java NIO和IO之间第一个最大的区别是,IO是面向流的,NIO是面向缓冲区的. Java IO面向流意味着每次从流中读一

[连载]《C#通讯(串口和网络)框架的设计与实现》-3.设备驱动的设计

目       录 第三章           设备驱动的设计... 2 3.1           初始化设备... 4 3.2           运行设备接口设计... 4 3.3           虚拟设备接口设计... 6 3.4           协议驱动设计... 7 3.5           命令缓存设计... 17 3.6           数据持久化设计... 24 3.7           IO数据交互设计... 26 3.8           通讯状态设计..

Java IO(一) 之 IO总览

前言: IO对于系统设计来说,是一个很重要的关注点,往往系统运行的瓶颈就在IO设计上,无论是数据库IO,文件IO还是网络IO,都需要进行精致的设计,才能使得系统达到最佳运行状态.对于现代系统并发量.数据量的剧增,IO处理对于系统显得更加重要.研究Java IO对于我们工作有益无害. Java.io包含了Java阻塞型IO的设计.Java的IO主要包含三个部分: 1.流式部分–IO的主体部分: 2.非流式部分–主要包含一些辅助流式部分的类,如:File类.RandomAccessFile类和Fil

Java NIO与IO

当学习了Java NIO和IO的API后,一个问题立即涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们怎样影响您的代码设计. Java NIO和IO的主要差别 下表总结了Java NIO和IO之间的主要区别,我会更具体地描写叙述表中每部分的差异. IO                NIO 面向流            面向缓冲 堵塞IO           非堵塞IO 无 选择器 面向流与面向缓冲 Java N