前端优化
减少http请求数
- 图片地图。客户单图片地图可以使用map标签来实现。如果正在导航或者其他超链接中使用多个图片,将他们转换为图片地图是加速页面的最简单的方式。
- CSS Sprites。将多幅图片合并成单独的图片。使用CSS的background-position属性,可以将HTML元素放置到背景图片期望的位置上。
- 内联图片。使用data:URL模式可以在Web页面中包含图片但无需额外的HTTP请求。
- 合并脚本和样式表。理想情况下,一个页面应该使用不多于一个脚本和样式表。
使用CDN存储前端资源
CDN用于发布静态内容,如图片、脚本、样式和Flash。
可使用http://17ce.com这个网站网站使用CDN后在各地的响应速度。
添加Expires头
充分利用浏览器缓存
多域名访问前端资源
使用单独的静态资源域名。
资源数据的压缩
压缩代码大小、图片大小,开启服务器gzip压缩
优化首屏展示速度
延迟加载、异步加载
扩展阅读:
php优化
使用opcode缓存
opcode缓存简介
当解释器完成对脚本代码的分析后,便将它们生成可以直接运行的中间代码,也称为操作码(Operate Code,opcode)。Opcode cache的目地是避免重复编译,减少CPU和内存开销。如果动态内容的性能瓶颈不在于CPU和内存,而在于I/O操作,比如数据库查询带来的磁盘I/O开销,那么opcode cache的性能提升是非常有限的。
使用opcode缓存

从图中可以看出,使用了opcode缓存后,php代码的生命周期少了词典扫描和表达式(将PHP代码转换为语言片段[Tokens])、解析文件(将Tokens转换成简单而有意义的表达式)、创建要执行的计算机代码(称为Opcode)几步。
opecode缓存-Zend OPcache安装使用
PHP>=5.5.0,php内置了OPcache,PHP小于5.5.0的话,要通过PCEL安装。
OPcache配置
1 | #检查脚本时间戳是否有更新的周期,以秒为单位。 设置为0会导致针对每个请求,OPcache都会检查脚本更新。 |
PHP 7
PHP 7相对比PHP 5.*,性能有了质的飞跃。PHP7相对于php5.6有2~3倍的性能提升。目前PHP的最新版本是PHP 7.2.5,相对于PHP 7.1也有部分性能提升。
性能评测文章参考:
PHP的性能演进(从PHP5.0到PHP7.1的性能全评测
PHP7.2、PHP7.1 性能对比
SWOOLE
Swoole是一款常驻内存的 PHP C扩展,Swoole提供了协程、Http Server、Tcp Server、UDP Server、
Websocket Server、定时器等功能
php性能分析 xhui + tideways实践
tiways是一个测试php性能的php扩展,php版本要求是大于等于7.0。如果php版本小于7.0,可以使用xhprof扩展。
xhgui用来展示测试数据,xhgui将数据保存到MongoDB。
安装tideways
在ubuntu环境下:
1 | echo 'deb http://s3-eu-west-1.amazonaws.com/qafoo-profiler/packages debian main' > /etc/apt/sources.list.d/tideways.list |
重启php-fpm,查看是否安装成功:
1 | sudo service php7.1-fpm restart |
安装MongoDB
1 | sudo apt-get install mongodb |
安装xhgui
1 | git clone https://github.com/laynefyc/xhgui-branch.git |
配置xhgui
添加config/config.php,添加支持扩展为tideways
1 | return [ |
MongoDB加索引
1 | $ mongo |
配置nginx
1.要监控的应用
1 | location ~ \.php$ { |
2.分析平台应用
1 | #表示省略了一些nginx配置 |
性能分析平台搭建效果

相关链接 :
- https://github.com/tideways/php-xhprof-extension
- https://tideways.io/profiler/docs/setup/installation
- https://github.com/laynefyc/xhgui-branch.git
- 使用XHProf查找PHP性能瓶颈
Mysql优化
表的设计优化
- 添加主键索引
innodb需要有一个主键,主键不要有业务用途。
表的字段类型选择
能选短整形,就不要选长整型
能选char就避免varchar
使用varchar类型的时候,长度够用就行
大字段考虑分开存储
字段适当冗余
索引的优化
索引不要建太多
在修改数据时,每个索引都要进行更新,降低写速度。
使用覆盖索引
explain分析sql语句的执行计划
示例:
1 | > explain select * from typecho_contents where cid=40; |
重要列:
type - 连接使用的类型
链接类型从最佳到最坏:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
解释:
system:表仅有一行(=系统表)。这是const联接类型的一个特例。 const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次! eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。 ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。 ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。 index_merge:该联接类型表示使用了索引合并优化方法。 unique_subquery:该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。 index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr) range:只检索给定范围的行,使用一个索引来选择行。 index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
key: Mysql实际使用的索引
Extra:
- Using filesort: Mysql需要额外的步骤排序,表示语句需要优化
- Using temporary: 使用到临时表来存储查询结果,表示语句需要优化
SQL查询优化
通过慢查询日志获取存在性能问题的SQL
慢查询日志分析工具
相关配置参数
1 |
|
工具:pt-query-digest
1 | pt-query-digest --explain h=127.0.0.1,u=root,p=123456 slow-mysql.log |
pt-query-digest是用于分析mysql慢查询的一个工具,它可以分析binlog、General log、slowlog。可以把分析结果输出到文件中,也可以对SHOW PROCESSLIST或者通过tcpdump抓取的MySQL协议数据进行分析。分析过程是先对查询语句的条件进行参数化,然后对参数化以后的查询进行分组统计,统计出各查询的执行时间、次数、占比等,可以借助分析结果找出问题。
pt-query-digest工具的安装
因为pt-query-digest是包含在percona-tookit工具集中的,所以只要安装percona-tookit即可。percona-tookie链接:https://www.percona.com/doc/percona-toolkit/3.0/installation.html
pt-query-digest工具的使用参考
https://www.cnblogs.com/luyucheng/p/6265873.html
实时获取存在性能问题的SQL
直接通过表查询
1 |
|
查询当前服务器执行超过1s的SQL,可以通过脚本周期性的来执行这条SQL,就能查出有问题的SQL。
通过pt-query-digst来分析
1 | pt-query-digest --processlist h=host1 |
特定SQL的查询优化
优化not in和<>查询
子查询改写为关联查询
1 |
|
改写后:
1 |
|
