重要
)相關配置參數:php
slow_query_log # 啓動中止記錄慢查日誌,慢查詢日誌默認是沒有開啓的能夠在配置文件中開啓(on) slow_query_log_file # 指定慢查日誌的存儲路徑及文件,日誌存儲和數據從存儲應該分開存儲 long_query_time # 指定記錄慢查詢日誌SQL執行時間的閥值默認值爲10秒一般,對於一個繁忙的系統來講,改成0.001秒(1毫秒)比較合適 log_queries_not_using_indexes #是否記錄未使用索引的SQL
經常使用工具:mysqldumpslow
和pt-query-digest
html
pt-query-digest --explain h=127.0.0.1,u=root,p=p@ssWord slow-mysql.log
SELECT id,user,host,DB,command,time,state,info FROM information_schema.processlist WHERE TIME>=60
查詢當前服務器執行超過60s
的SQL
,能夠經過腳本週期性的來執行這條SQL
,就能查出有問題的SQL
。mysql
重要
)重點!!!
)
上圖原文鏈接sql
SQL
語句。SQL
解析,預處理,再由優化器生成對應的查詢執行計劃。第一階段:
相關配置參數:thinkphp
query_cache_type # 設置查詢緩存是否可用 query_cache_size # 設置查詢緩存的內存大小 query_cache_limit # 設置查詢緩存可用的存儲最大值(加上sql_no_cache能夠提升效率) query_cache_wlock_invalidate # 設置數據表被鎖後是否返回緩存中的數據 query_cache_min_res_unit # 設置查詢緩存分配的內存塊的最小單
緩存查找是利用對大小寫敏感的哈希查找
來實現的,Hash查找只能進行全值查找(sql徹底一致),若是緩存命中,檢查用戶權限,若是權限容許,直接返回,查詢不被解析,也不會生成查詢計劃。
在一個讀寫比較頻繁的系統中,建議關閉緩存,由於緩存更新會加鎖
。將query_cache_type
設置爲off
,query_cache_size
設置爲0
。這個階段包括了多個子過程:數據庫
一條查詢能夠有多種查詢方式
,查詢優化器會對每一種查詢方式的(存儲引擎)統計信息進行比較,找到成本最低的查詢方式,這也就是索引不能太多的緣由
。 一、統計信息不許確
二、成本估算與實際的執行計劃成本不一樣segmentfault
三、給出的最優執行計劃與估計的不一樣緩存
四、MySQL不考慮併發查詢
五、會基於固定規則生成執行計劃
六、MySQL不考慮不受其控制的成本,如存儲過程,用戶自定義函數服務器
查詢優化器:對查詢進行優化並查詢mysql認爲的成本最低的執行計劃。 爲了生成最優的執行計劃,查詢優化器會對一些查詢進行改寫
能夠優化的sql類型session
一、從新定義表的關聯順序;
二、將外鏈接轉換爲內鏈接;
三、使用等價變換規則;
四、優化count(),min(),max();
五、將一個表達式轉換爲常數;
六、子查詢優化;
七、提早終止查詢,如發現一個不成立條件(如where id = -1
),當即返回一個空結果;
八、對in()條件進行優化;
set profiling = 1; #啓動profile,這是一個session級的配製執行查詢 show profiles; # 查詢每個查詢所消耗的總時間的信息 show profiles for query N; # 查詢的每一個階段所消耗的時間
啓動監控和歷史記錄表:use performance_schema
update setup_instruments set enabled='YES',TIME = 'YES' WHERE NAME LIKE 'stage%'; update set_consumbers set enabled='YES',TIME = 'YES' WHERE NAME LIKE 'event%';
添加一個新表(修改後的結構),老表數據導入新表,老表創建觸發器,修改數據同步到新表, 老表加一個排它鎖(重命名), 新表重命名, 刪除老表。
修改語句這個樣子:
alter table sbtest4 modify c varchar(150) not null default ''
利用工具修改:
子查詢改寫爲關聯查詢:
分擔讀負載 可經過 一主多從,升級硬件來解決。
拆分簡單,不容許跨庫。但並不能減小寫負載。
該方式只能在必定時間內減小寫壓力。
以上兩種方式只能暫時解決讀寫性能問題。
對一個庫中的相關表進行水平拆分到不一樣實例的數據庫中
完!