第七星尘

迁离SAE系列:次数优化篇

一,前言:

新浪云计算平台SAE更改了计费策略后,新的计费策略使得网站运行的成本越来越高,于是很多开发者包括本人都准备把应用和网站迁离SAE平台了。然而SAE平台跟普通PHP环境始终有区别。特别是当你的应用使用到SAE的一些云服务的时候,此时要迁移就必须改动下代码。本人将整理下自己迁离的一些经验,分享出来,希望对需要的人有帮助。

二,需求分析

我的网站是每天都不断有用户访问的,而说迁离总不能一下子就迁离了,改程序总需要时间。因为,首先要做的是,优化你的原程序,减少云豆消耗。而且云豆消耗下降了后,你迁离到新环境时服务器压力也会小些。 对于我的程序的实际情况,发现mysql的次数特别多特别消耗云豆,所以我决定在这方面下一下功夫。

三,主要的思路

记录下mysql语句的执行次数,把重复执行次数比较多的mysql语句进行程序优化,减少次数。

四,操作方法

1. 新建db_query_record表

请在数据库中执行以下sql语句:

CREATE TABLE IF NOT EXISTS `db_query_record` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `sql` varchar(255) NOT NULL,
  `count` int(10) NOT NULL,
  `execute_time` float NOT NULL,
  `last_update_time` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `sql` (`sql`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
2. 改写mysql_query()

我们首先要在数据库执行前插入一段代码,此段代码的作用是把mysql语句的执行情况记录到数据库中。如果你是用PHP原生的mysql操作函数,那就可以写一个函数来替换mysql_query();如果你是用了一些mysql操作类,其更改原理也类似,你看完下面的代码应该会懂(如果你有编程经验的话)

function db_query($sql , $connection = ''){
    //统计sql执行情况
    $time1 = microtime();
    $result = mysql_query($sql , $connection);
    $time2 = microtime();
    $execute_time =  $time2 - $time1;
    $sql = urlencode($sql);
    $sql2 = "insert into db_query_record (`sql` , count , execute_time  , last_update_time )values('$sql' , 1 , '$execute_time',now())ON DUPLICATE KEY UPDATE count = count +1 , execute_time = '$execute_time',  last_update_time = now() " ;
    mysql_query($sql2 );
    return $result;
}

当写好上面这段函数代码后,然后把程序中所有用到mysql_query()的地方都替换为db_query()。大概程序执行半个小时到一个小时,db_query_record表便会收集到一定量的mysql语句执行记录。此时你可以暂时把db_query()里面关于记录的代码注释掉,以免记录语句给网站带来过大的压力。

3. 分析db_query_record表

首先将此表按照count字段进行倒序排序,找出执行次数最多的那些sql语句。然后分析能不能减少这些sql语句的执行。例如我发现“set names utf8”这条语句执行得非常频繁。SAE平台本来默认就是utf8编码,所以这条SQL语句明显可以不执行,去代码里注释即可。 其他分析方法也是类似的思路,结合业务情况,省略掉不必要的执行。

4. 结合xhprof工具来分析mysql调用情况

在SAE管理后台,进行自己的某个应用,在左侧栏的“开发与调优”-“XHProf”,便可看到XHProf在SAE的使用方法,此处不再介绍。重点介绍下优化思路。 查看XHProf的记录时,请重点查看db_query()函数的执行次数以及它的上级函数。比如说,我发现在访问“检查未读消息”接口的时候,db_query()执行了四次。我分别看了下这四次被调用的上级函数,发现有两次是检查邮件队列和系统通知队列。这两个操作对我的业务来说是比不必要的。因此可以把相关代码注释掉。 其他优化大体思路如此。

分享到: 更多
码字很辛苦,转载请注明来自第七星尘的技术博客《迁离SAE系列:次数优化篇》

评论

  1. 0xcb #1

    绝对赞成,一开始把个人信息还提交了,最终换来的是很差劲的服务!这就是云服务

    回复
    2016-07-6
  2. 韵寒 #2

    好文,双手赞成!

    回复
    2015-11-23