MySQL性能管理及架構設計(三):SQL查詢優(yōu)化赏半、分庫分表 - 完結篇

一义起、SQL查詢優(yōu)化(重要)

1.1 獲取有性能問題SQL的三種方式

  1. 通過用戶反饋獲取存在性能問題的SQL;

  2. 通過慢查日志獲取存在性能問題的SQL脖咐;

  3. 實時獲取存在性能問題的SQL铺敌;

1.1.2 慢查日志分析工具

相關配置參數(shù):

<pre>slow_query_log # 啟動停止記錄慢查日志,慢查詢?nèi)罩灸J是沒有開啟的可以在配置文件中開啟(on) slow_query_log_file # 指定慢查日志的存儲路徑及文件屁擅,日志存儲和數(shù)據(jù)從存儲應該分開存儲 long_query_time # 指定記錄慢查詢?nèi)罩維QL執(zhí)行時間的閥值默認值為10秒通常,對于一個繁忙的系統(tǒng)來說,改為0.001秒(1毫秒)比較合適 log_queries_not_using_indexes #是否記錄未使用索引的SQL</pre>

常用工具:mysqldumpslow和pt-query-digest

<pre>pt-query-digest --explain h=127.0.0.1,u=root,p=p@ssWord slow-mysql.log</pre>

10年架構師領你架構-成長之路-(附面試題(含答案))

(騰訊T3-T4)打造互聯(lián)網(wǎng)PHP架構師教程目錄大全偿凭,只要你看完,薪資立馬提升2倍(持續(xù)更新)

點擊與我交流企鵝群.

1.1.3 實時獲取有性能問題的Sad-imageshu.io/upload_images/20190641-791ae20aa9662a09.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

image.gif

?

SELECT id,user,host,DB,command,time,state,info FROM information_schema.processlist WHERE TIME>=60

查詢當前服務器執(zhí)行超過60s的SQL派歌,可以通過腳本周期性的來執(zhí)行這條SQL弯囊,就能查出有問題的SQL。

1.2 SQL的解析預處理及生成執(zhí)行計劃(重要)

1.2.1 查詢過程描述(重點=汗X抑觥!)

image
image.gif

?

上圖原文連接

通過上圖可以清晰的了解到MySql查詢執(zhí)行的大致過程:

  1. 發(fā)送SQL語句早抠。

  2. 查詢緩存霎烙,如果命中緩存直接返回結果。

  3. SQL解析蕊连,預處理吼过,再由優(yōu)化器生成對應的查詢執(zhí)行計劃。

  4. 執(zhí)行查詢咪奖,調(diào)用存儲引擎API獲取數(shù)據(jù)。

  5. 返回結果酱床。

1.2.2 查詢緩存對性能的影響(建議關閉緩存)

第一階段: 相關配置參數(shù):

<pre>query_cache_type # 設置查詢緩存是否可用 query_cache_size # 設置查詢緩存的內(nèi)存大小 query_cache_limit # 設置查詢緩存可用的存儲最大值(加上sql_no_cache可以提高效率) query_cache_wlock_invalidate # 設置數(shù)據(jù)表被鎖后是否返回緩存中的數(shù)據(jù) query_cache_min_res_unit # 設置查詢緩存分配的內(nèi)存塊的最小單</pre>

緩存查找是利用對大小寫敏感的哈希查找來實現(xiàn)的羊赵,Hash查找只能進行全值查找(sql完全一致),如果緩存命中扇谣,檢查用戶權限昧捷,如果權限允許,直接返回罐寨,查詢不被解析靡挥,也不會生成查詢計劃。

在一個讀寫比較頻繁的系統(tǒng)中鸯绿,建議關閉緩存跋破,因為緩存更新會加鎖簸淀。將query_cache_type設置為off,query_cache_size設置為0。

1.2.3 第二階段:MySQL依照執(zhí)行計劃和存儲引擎進行交互

這個階段包括了多個子過程:

image
image.gif

?

image
image.gif

?

image
image.gif

?

一條查詢可以有多種查詢方式毒返,查詢優(yōu)化器會對每一種查詢方式的(存儲引擎)統(tǒng)計信息進行比較租幕,找到成本最低的查詢方式,這也就是索引不能太多的原因拧簸。

1.3 會造成MySQL生成錯誤的執(zhí)行計劃的原因

1劲绪、統(tǒng)計信息不準確 2、成本估算與實際的執(zhí)行計劃成本不同

image
image.gif

?

3盆赤、給出的最優(yōu)執(zhí)行計劃與估計的不同

image
image.gif

?

4贾富、MySQL不考慮并發(fā)查詢 5、會基于固定規(guī)則生成執(zhí)行計劃 6牺六、MySQL不考慮不受其控制的成本颤枪,如存儲過程,用戶自定義函數(shù)

感謝大家一直來支持兔乞,這是我準備的1000粉絲福利

【1000粉絲福利】10年架構師分享PHP進階架構資料汇鞭,助力大家都能30K

點擊與我交流企鵝群.

1.4 MySQL優(yōu)化器可優(yōu)化的SQL類型

查詢優(yōu)化器:對查詢進行優(yōu)化并查詢mysql認為的成本最低的執(zhí)行計劃。 為了生成最優(yōu)的執(zhí)行計劃庸追,查詢優(yōu)化器會對一些查詢進行改寫

可以優(yōu)化的sql類型

1霍骄、重新定義表的關聯(lián)順序;

image
image.gif

?

2淡溯、將外連接轉換為內(nèi)連接读整;

3、使用等價變換規(guī)則咱娶;

image
image.gif

?

4米间、優(yōu)化count(),min(),max();

image
image.gif

?

5膘侮、將一個表達式轉換為常數(shù)屈糊; 6、子查詢優(yōu)化琼了;

image
image.gif

?

7逻锐、提前終止查詢,如發(fā)現(xiàn)一個不成立條件(如where id = -1)雕薪,立即返回一個空結果昧诱;

8、對in()條件進行優(yōu)化所袁;

1.5 查詢處理各個階段所需要的時間

1.5.1 使用profile(目前已經(jīng)不推薦使用了)

<pre>set profiling = 1; #啟動profile,這是一個session級的配制執(zhí)行查詢 show profiles; # 查詢每一個查詢所消耗的總時間的信息 show profiles for query N; # 查詢的每個階段所消耗的時間</pre>

1.5.2 performance_schema是5.5引入的一個性能分析引擎(5.5版本時期開銷比較大)

啟動監(jiān)控和歷史記錄表:use performance_schema

<pre>update setup_instruments set enabled='YES',TIME = 'YES' WHERE NAME LIKE 'stage%'; update set_consumbers set enabled='YES',TIME = 'YES' WHERE NAME LIKE 'event%';</pre>

image
image.gif

?

image
image.gif

?

1.6 特定SQL的查詢優(yōu)化

1.6.1 大表的數(shù)據(jù)修改

image
image.gif

?

image
image.gif

?

1.6.2 大表的結構修改

image
image.gif

?

  1. 利用主從復制盏档,先對從服務器進入修改,然后主從切換

  2. (推薦)

大廠2000道面試題(含答案)

PHP面試題匯總燥爷,看完這些面試題助力你面試成功蜈亩,工資必有20-25K

點擊與我交流企鵝群.

添加一個新表(修改后的結構)懦窘,老表數(shù)據(jù)導入新表,老表建立觸發(fā)器勺拣,修改數(shù)據(jù)同步到新表奶赠, 老表加一個排它鎖(重命名), 新表重命名药有, 刪除老表毅戈。

image
image.gif

?

修改語句這個樣子:

<pre>alter table sbtest4 modify c varchar(150) not null default ''</pre>

利用工具修改:

image
image.gif

?

1.6.3 優(yōu)化not in 和 <> 查詢

子查詢改寫為關聯(lián)查詢:

image
image.gif

?

二、分庫分表

2.1 分庫分表的幾種方式

分擔讀負載 可通過 一主多從愤惰,升級硬件來解決苇经。

2.1.1 把一個實例中的多個數(shù)據(jù)庫拆分到不同實例(集群)

image
image.gif

?

拆分簡單,不允許跨庫。但并不能減少寫負載宦言。

2.1.2 把一個庫中的表分離到不同的數(shù)據(jù)庫中

image
image.gif

?

該方式只能在一定時間內(nèi)減少寫壓力扇单。

以上兩種方式只能暫時解決讀寫性能問題。

2.1.3 數(shù)據(jù)庫分片

對一個庫中的相關表進行水平拆分到不同實例的數(shù)據(jù)庫中

image
image.gif

?

2.1.3.1 如何選擇分區(qū)鍵

  1. 分區(qū)鍵要能盡可能避免跨分區(qū)查詢的發(fā)生

  2. 分區(qū)鍵要盡可能使各個分區(qū)中的數(shù)據(jù)平均

2.1.3.2 分片中如何生成全局唯一ID

image
image.gif

?

擴展:表的垂直拆分和水平拆分奠旺。

喜歡我的文章就關注我吧蜘澜,持續(xù)更新中.....

以上內(nèi)容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸响疚,業(yè)務代碼寫多了沒有方向感鄙信,不知道該從那里入手去提升,對此我整理了一些資料忿晕,包括但不限于:分布式架構装诡、高可擴展、高性能践盼、高并發(fā)鸦采、服務器性能調(diào)優(yōu)、TP6咕幻,laravel渔伯,YII2,Redis肄程,Swoole锣吼、Swoft、Kafka绷耍、Mysql優(yōu)化、shell腳本鲜侥、Docker褂始、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家描函,需要的可以點擊進入暗號:知乎崎苗。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末狐粱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子胆数,更是在濱河造成了極大的恐慌肌蜻,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件必尼,死亡現(xiàn)場離奇詭異蒋搜,居然都是意外死亡,警方通過查閱死者的電腦和手機判莉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門豆挽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人券盅,你說我怎么就攤上這事帮哈。” “怎么了锰镀?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵娘侍,是天一觀的道長。 經(jīng)常有香客問我泳炉,道長憾筏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任胡桃,我火速辦了婚禮踩叭,結果婚禮上,老公的妹妹穿的比我還像新娘翠胰。我一直安慰自己容贝,他們只是感情好,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布之景。 她就那樣靜靜地躺著斤富,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锻狗。 梳的紋絲不亂的頭發(fā)上满力,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天,我揣著相機與錄音轻纪,去河邊找鬼油额。 笑死,一個胖子當著我的面吹牛刻帚,可吹牛的內(nèi)容都是我干的临扮。 我是一名探鬼主播卿泽,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼固以,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了航厚?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锰蓬,失蹤者是張志新(化名)和其女友劉穎幔睬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體芹扭,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡麻顶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了冯勉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澈蚌。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖灼狰,靈堂內(nèi)的尸體忽然破棺而出宛瞄,到底是詐尸還是另有隱情,我是刑警寧澤交胚,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布份汗,位于F島的核電站,受9級特大地震影響蝴簇,放射性物質(zhì)發(fā)生泄漏杯活。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一熬词、第九天 我趴在偏房一處隱蔽的房頂上張望旁钧。 院中可真熱鬧,春花似錦互拾、人聲如沸歪今。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寄猩。三九已至,卻和暖如春骑疆,著一層夾襖步出監(jiān)牢的瞬間田篇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工箍铭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泊柬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓诈火,卻偏偏與公主長得像兽赁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355