關於mysql 一些優化心得

先介紹下服務器架構及配置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

  1. vim /etc/my.cnf

  2.  

  3. long_query_time = 2

  4. log_slow_queries = /data/mysql/slow.log

  5.  

  6. service mysqld restart   ##重啓mysql服務

  7.  

 

七、查看慢日誌來定位mysql哪條語句執行慢,而後創建索引,優化sql執行語句。

  1. <font color="Red">tail -n20 /data/mysql/slow.log   #查看20行</font>

  2.  

  3.  

  4. # Time: 160303 12:12:38

  5. # User@Host: root[root] @  [10.165.34.182]

  6. # Query_time: 10.145685  Lock_time: 0.000395 Rows_sent: 1  Rows_examined: 24306970

  7. use shop;

  8. SET timestamp=1456978358;

  9. 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);

  10. # Time: 160303 12:12:44

  11. # User@Host: root[root] @  [10.165.34.182]

  12. # Query_time: 6.073441  Lock_time: 0.000152 Rows_sent: 15  Rows_examined: 24314767

  13. SET timestamp=1456978364;

  14. 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,對查詢慢的表進行設計,增長索引

0160304191200.png

 

根據 explain  的解釋,查看下  索引是否創建,通常都是 這樣調整 就行。

QQ圖片20160304202041.png

 

修改完後重啓mysql 服務,查詢時間從65s,縮短到 0.017407 秒

QQ截圖20160304202346.png

 

參考了大量的網絡資料,頭一次搞優化。優化完後頗有成就感,算是一次新的挑戰

QQ圖片20160304181535.png0160304191200.pngQQ圖片20160304202041.pngQQ截圖20160304202346.png

相關文章
相關標籤/搜索