响影响MySQL性能的相关因素

前言

大部分人都一致认为一个数据库应用系统(这里的数据库应用系统概指所有使用数据库的系统)的性能瓶颈最容易出现在数据的操作方面,而数据库应用系统的大部分数据操作都是通过数据库管理软件所提供的相关接口来完成的。所以数据库管理软件也就很自然的成为了数据库应用系统的性能瓶颈所在,这是当前业界比较普遍的一个看法。

我们将通过本文的内容来进行一个较为深入的分析,让大家了解到一个数据库应用系统的性能到底与哪些地方有关,让大家寻找出各自应用系统的出现性能问题的根本原因,而尽可能清楚的知道该如何去优化自己的应用系统。

商业需求对性能的影响

应用系统中的每一个功能在设计初衷肯定都是出于为用户提供某种服务,或者满足用户的某种需求,但是,并不是每一个功能在最后都能很成功,甚至有些功能的推出可能在整个系统中是画蛇添足。不仅没有为用户提高任何体验度,也没有为用户改进多少功能易用性,反而在整个系统中成为一个累赘,带来资源的浪费。

样例一
需求:一个论坛帖子总量的统计
附加要求:实时更新

在很多人看来,这个功能非常容易实现,不就是执行一条 SELECT COUNT(*)的 Query 就可以得到结果了么?如果存放帖子的表中已经有上千万的帖子的时候,执行这条 Query 语句需要多少成本?如果我们的访问量再大一点,还有人觉得这是一件简单的事情么?

既然这样查询不行,那我们是不是该专门为这个功能建一个表,就只有一个字段,一条记录,就存放这个统计量,每次有新的帖子产生的时候,都将这个值增加1,这样我们每次都只需要查询这个表就可以得到结果了,这个效率肯定能够满足要求了。确实,查询效率肯定能够满足要求,可是如果我们的系统帖子产生很快,在高峰时期可能每秒就有几十甚至上百个帖子新增操作的时候,恐怕这个统计表又要成为大家的噩梦了。要么因为并发的问题造成统计结果的不准确,要么因为锁资源争用严重造成整体性能的大幅度下降。

其实这里问题的焦点不应该是实现这个功能的技术细节,而是在于这个功能的附加要求“实时更新”上面。当一个论坛的帖子数量很大了之后,到底有多少人会关注这个统计数据是否是实时变化的?即使明明白白的告诉用户这个统计数据是每过多长时间段更新一次,那有怎样?难道会有很多用户就此很不爽么?

只要去掉了这个“实时更新”的附加条件,我们就可以非常容易的实现这个功能了。就像之前所提到的那样,通过创建一个统计表,然后通过一个定时任务每隔一定时间段去更新一次里面的统计值,这样既可以解决统计值查询的效率问题,又可以保证不影响新发贴的效率,一举两得。

实际上,在我们应用的系统中还有很多很多类似的功能点可以优化。如某些场合的列表页面参与列表的数据量达到一个数量级之后,完全可以不用准确的显示这个列表总共有多少条信息,总共分了多少页,而只需要一个大概的估计值或者一个时间段之前的统计值。这样就省略了我们的分页程序需要在分以前实时 COUNT 出满足条件的记录数。

其实,在很多应用系统中,实时和准实时,精确与基本准确,在很多地方所带来的性能消耗可能是几个性能的差别。在系统性能优化中,应该尽量分析出那些可以不实时和不完全精确的地方,作出一些相应的调整,可能会给大家带来意想不到的巨大性能提升。

系统架构及实现对性能的影响

以下几类数据都是不适合在数据库中存放的:

1. 二进制多媒体数据
这种数据主要包括图片,音频、视频和其他一些相关的二进制文件。这些数据的处理本不是数据的优势,如果我们硬要将他们塞入数据库,肯定会造成数据库的处理资源消耗严重。

2. 流水队列数据
我们都知道,数据库为了保证事务的安全性(支持事务的存储引擎)以及可恢复性,都是需要记录所有变更的日志信息的。而流水队列数据的用途就决定了存放这种数据的表中的数据会不断的被 INSERT,UPDATE 和 DELETE,而每一个操作都会生成与之对应的日志信息。在 MySQL 中,如果是支持事务的存储引擎,这个日志的产生量更是要翻倍。而如果我们通过一些成熟的第三方队列软件来实现这个 Queue 数据的处理功能,性能将会成倍的提升。

3. 超大文本数据
超大文本数据存放在数据库中不仅会带来性能低下的问题,还会带来空间占用的浪费问题。

4. 是否合理的利用了应用层 Cache 机制
对于 Web 应用,活跃数据的数据量总是不会特别的大,有些活跃数据更是很少变化。对于这类数据,我们是否有必要每次需要的时候都到数据库中去查询呢?如果我们能够将变化相对较少的部分活跃数据通过应用层的Cache机制Cache到内存中,对性能的提升肯定是成数量级的,而且由于是活跃数据,对系统整体的性能影响也会很大。这里我仅根据以往的经验列举一下什么样的数据适合通过 Cache 技术来提高系统性能:

a. 系统各种配置及规则数据
由于这些配置信息变动的频率非常低,访问概率又很高,所以非常适合存使用 Cache;

b. 活跃用户的基本信息数据
很少有用户每天没事干去将自己的基本信息改来改去,更为重要的一点是用户的基本信息在应用系统中的访问频率极其频繁。所以用户基本信息的Cache,很容易让整个应用系统的性能出现一个质的提升。

c. 准实时的统计信息数据
所谓准实时的统计数据,实际上就是基于时间段的统计数据。这种数据不会实时更新,也很少需要增量更新,只有当达到重新 Build 该统计数据的时候需要做一次全量更新操作。

d. 其他一些访问频繁但变更较少的数据
在我们面对的各种系统环境中肯定还会有各种各样的变更较少但是访问很频繁的数据。只要合适,我们都可以将对他们的访问从数据库移到 Cache 中。

数据层实现案例

在我们的示例网站系统中,现在要实现每个用户查看各自相册列表(假设每个列表显示 10 张相片)的时候,能够在相片名称后面显示该相片的留言数量。

1、通过“SELECT id,subject,url FROM photo WHERE user_id = ? limit 10” 得到第一页的相片相关信息;

2、通过程序拼装上面得到的 10 个 photo 的 id,再通过 in 查询“SELECT photo_id,count() FROM photo_comment WHERE photo_id in (?) GROUP BY photo_id” 一次得到 10 个 photo 的所有回复数量,再组装两个结果集得到展现对象。通常查询数据量不多(这里只有十条数据)的时候,这种方式会远远优于“用10 个相片 id 循环运行十次“SELECT COUNT() FROM photo_comment WHERE photh_id = ?” 来得到每张相册的回复数量然后再瓶装展现对象”。

常见的架构设计实现不当带来的性能问题和资源浪费情况。
1、Cache 系统的不合理利用导致 Cache 命中率低下造成数据库访问量的增加,同时也浪费了 Cache系统的硬件资源投入;

2、对可扩展性的过渡追求,促使系统设计的时候将对象拆得过于离散,造成系统中大量的复杂Join语句,而 MySQL Server 在各数据库系统中的主要优势在于处理简单逻辑的查询,这与其锁定的机制也有较大关系;

3、对数据库的过渡依赖,将大量更适合存放于文件系统中的数据存入了数据库中,造成数据库资源的浪费,影响到系统的整体性能,如各种日志信息;

4、过度理想化系统的用户体验,使大量非核心业务消耗过多的资源,如大量不需要实时更新的数据做了实时统计计算。

数据模型设计对系统的性能影响

1、对字段冗余的适当把握,有时候一些很少更改的字段的冗余,可以减少查询的复杂度(例如用户名称这样的字段)。

2、在某些情况下把大字段(如:tex)分离出去,如果大部分查询都不需要用到大字段,这可以把大字段从表中分离出去,另起一个表。

Query 语句对系统性能的影响

我们重点分析实现同样功能的不同 SQL 语句在性能方面会产生较大的差异的根本原因,并通过一个较为典型的示例来对我们的分析做出相应的验证。

当 MySQL Server 的连接线程接收到 Client 端发送过来的 SQL 请求之后,会经过一系列的分解Parse,进行相应的分析。然后,MySQL 会通过查询优化器模块(Optimizer)根据该 SQL 所设涉及到的数据表的相关统计信息进行计算分析,然后再得出一个 MySQL 认为最合理最优化的数据访问方式,也就是我们常说的“执行计划”,然后再根据所得到的执行计划通过调用存储引擎借口来获取相应数据。然后再将存储引擎返回的数据进行相关处理,并以 Client 端所要求的格式作为结果集返回给 Client 端的应用程序。

硬件环境对系统性能的影响

对这点,这里暂时不做讨论。

小结

虽然本章是以影响 MySQL Server 性能的相关因素来展开分析,但实际上很多内容都对于大多数数据库应用系统适用。数据库管理软件仅仅是实现了数据库应用系统中的数据存取操作,和数据的持久化。数据库应用系统的优化真正能带来最大收益的就是商业需求和系统架构及业务实现的优化,然后是数据库 Schema 设计的优化,然后才是 Query 语句的优化,最后才是数据库管理软件自身的一些优化。在整个系统的性能优化中,如果按照百分比来划分上面几个层面的优化带来的性能收益,可以得出大概如下的数据:
需求和架构及业务实现优化:55%
Query 语句的优化:30%
数据库自身的优化:15%
所以,数据库应用系统的优化,实际上是一个需要多方面配合,多方面优化的才能产生根本性改善的事情。简单来说,可以通过下面三句话来简单的概括数据库应用系统的性能优化:商业需求合理化,系统架构最优化,逻辑实现精简化,硬件设施理性化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值