先介绍下服务器架构及配置8核8G,10M带宽Centos6.5 64php
Nginx 1.8.1PHP 5.3.29Mysql 5.5.42mysql
一电商网站后台查询订单时 常常php超时,致使php报错如下是排查过程sql
一、php执行超时,首先咱们想到的就是php.ini文件中max_execution_time = #把默认的值调整了下数据库
二、而后在后台执行订单查询php不报错了,可是查询耗时较长,用时65s. 并且一些表成锁死状态碎片比较多,本人对mysql数据库优化不是很了解,因而请教了铭哥下,铭哥给出的答复是:通常mysql调优主要是根据慢查询日志去优化sql语句,my.cnf里面没啥可调的。 下面就是分析mysql慢日志,调整参数三、mysql参数优化,主要调整的参数以下。根据机器性能来调整,若是你对参数不是很了解,建议不要盲目的调vim
mysql优化帖子 http://ask.apelearn.com/question/5758服务器
把一些配置文件修改好后重启相关服务,由原来的65s变成了十几秒。效果仍是不是很理想,查看了下mysql默认引擎为MyISAM,决定把引擎改成Innodb网络
一、导出shop数据库的表结构mysqldump -d -uxxx -p shop > shop_table.sql其中-d参数表示不导出数据,只导出表结构mysql优化
二、替换shop_table.sql里的MyISAM为INNODBsed -i 's/MyISAM/INNODB/g' shop_table.sql三、新建数据库shop_new,并导入表结构mysql > create database shop_new;mysql -uroot -p shop_new < shop_table.sql能够经过show table status来检查表引擎是否为INNODB。架构
四、导出shop的数据mysqldump -t -uroot -p shop > shop_data.sql其中-t参数表示只导数据,不导表结构性能
五、导入数据到shop_newmysql -uroot -p shop_new < shop_data.sql
六、 首先开启慢日志,修改/etc/my.cnf 增长如下两段配置,保存重启mysql
vim /etc/my.cnf
long_query_time = 2
log_slow_queries = /data/mysql/slow.log
service mysqld restart ##重启mysql服务
七、查看慢日志来定位mysql哪条语句执行慢,而后创建索引,优化sql执行语句。
<font color="Red">tail -n20 /data/mysql/slow.log #查看20行</font>
# Time: 160303 12:12:38
# User@Host: root[root] @ [10.165.34.182]
# Query_time: 10.145685 Lock_time: 0.000395 Rows_sent: 1 Rows_examined: 24306970
use shop;
SET timestamp=1456978358;
SELECT COUNT(*) FROM `shop`.`ecs_order_info` o LEFT JOIN`shop`.`ecs_users` u ON o.user_id = u.user_id LEFT JOIN `shop`.`ecs_affiliate_log` a ON o.order_id = a.order_id WHERE o.user_id > 0 AND (u.parent_id > 0 AND o.is_separate = 0 OR o.is_separate > 0);
# Time: 160303 12:12:44
# User@Host: root[root] @ [10.165.34.182]
# Query_time: 6.073441 Lock_time: 0.000152 Rows_sent: 15 Rows_examined: 24314767
SET timestamp=1456978364;
SELECT o.*, a.log_id, a.user_id as suid, a.user_name as auser, a.money, a.point, a.separate_type,u.parent_id as up FROM `shop`.`ecs_order_info` o LEFT JOIN`shop`.`ecs_users` u ON o.user_id = u.user_id LEFT JOIN `shop`.`ecs_affiliate_log` a ON o.order_id = a.order_id WHERE o.user_id > 0 AND (u.parent_id > 0 AND o.is_separate = 0 OR o.is_separate > 0) ORDER BY order_id DESC LIMIT 0,15;
经过慢日志发现其中有几个表查询耗时较长,下面就是把这个查询慢的表创建索引
用到的软件 NAvicat,对查询慢的表进行设计,增长索引
根据 explain 的解释,查看下 索引是否创建,通常都是 这样调整 就行。
修改完后重启mysql 服务,查询时间从65s,缩短到 0.017407 秒
参考了大量的网络资料,头一次搞优化。优化完后颇有成就感,算是一次新的挑战