这个话题可能看起来很枯燥,但它对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. 更多文章请扫码:
相关推荐
性能监控时,首先要确定应用的类型,然后对症下药,可以将应用分成:CPU密集型:CPU开销很高,比如大量的CPU运算、科学计算等。通常web server属于这类。IO密集型:大量的磁盘读写,高负荷的内存使用。IO密集型不会...
1. C语言和汇编语言在开发单片机时各有哪些优缺点? 答:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行... 以下是设计高频电路板的一些建议:...
S型T梯形曲线SpTA加减速控制算法软件源码,SpTA算法具有更好的自适应性,控制效果更佳,特别适合移植在CPLD\FPGA中实现对多路(有多少IO,就可以控制多少路)电机控制,它并不像S曲线那样依赖于PWM定时器的个数。...
例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;...
例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;...
前者往往依赖于主流厂商的硬件,纵向扩展负载CPU,面对 IO的压力只能水平垂直拆分业务. 后者未被 Oracle 收购前版本在面对存储单点故障时 M_M_S 的结构又不那么灵活.而 Mssql 属于2 者中间.在面对不同业务需求时候 ...
新的方法来进行板卡设计,使你能够享受极大的自由,从而能够使你在设计的 不同阶段随意转换,按你正常的设计流量进行工作。 Protel DXP 拥有:分级线路图设计、Spice 3f5 混合电路模拟、完全支持线路 图基础上的FPGA...
它实现了虚拟CPU与物理CPU的1-1映射,无需调度程序。 Bao没有外部依赖关系,例如,在运行不可信任的大型整体通用操作系统(例如Linux)的特权VM上,因此,它包含的TCB要小得多。 Bao最初以Armv8-A架构为目标,...
Bao主要针对混合关键性系统而设计,非常注重故障隔离和实时行为的隔离。 它的实现仅包括一个最小的特权软件薄层,这些软件利用ISA虚拟化支持来实现静态分区虚拟机管理程序体系结构:资源是在VM实例化时进行静态分区...
管理Hadoop 1478.1 为实际应用设置特定参数值 1478.2 系统体检 1498.3 权限设置 1518.4 配额管理 1518.5 启用回收站 1528.6 删减DataNode 1528.7 增加DataNode 1538.8 管理NameNode和SNN 1538.9 ...
Toad由Oracle开发专家专门为开发人员而设计,是一个功能强大、结构紧凑的专业化PL/SQL开发环境。 Toad 主要具有如下特点: 模式浏览: 模式浏览功能可以让我们快速访问数据字典,浏览数据库中的表、索引、存储过程。...
说明: 指定多个监听程序的地址是分别指定的, 还是用一个 ADDRESS_LIST 字符串指定。如果该值为 TRUE, MTS_LISTENER_ADDRESS 参数可被指定为: (ADDRESS_LIST=(ADDRESS=(PROTOCOL=tcp)(PORT=5000)(HOST=zeus)) ...
1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................