溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么掌握mysql查詢優(yōu)化和分庫分表

發(fā)布時間:2021-11-17 11:38:21 來源:億速云 閱讀:141 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“怎么掌握mysql查詢優(yōu)化和分庫分表”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么掌握mysql查詢優(yōu)化和分庫分表”吧!

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

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

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

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

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

1.1.2 慢查日志分析工具

相關配置參數(shù):

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

  常用工具:mysqldumpslowpt-query-digest

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

1.1.3 實時獲取有性能問題的SQL(推薦

怎么掌握mysql查詢優(yōu)化和分庫分表

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

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

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

1.2.1 查詢過程描述(重點?。?!

怎么掌握mysql查詢優(yōu)化和分庫分表

上圖原文連接

通過上圖可以清晰的了解到MySql查詢執(zhí)行的大致過程:
  1. 發(fā)送SQL語句。

  2. 查詢緩存,如果命中緩存直接返回結(jié)果。

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

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

  5. 返回結(jié)果。

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

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

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)存塊的最小單
緩存查找是利用對大小寫敏感的哈希查找來實現(xiàn)的,Hash查找只能進行全值查找(sql完全一致),如果緩存命中,檢查用戶權(quán)限,如果權(quán)限允許,直接返回,查詢不被解析,也不會生成查詢計劃。
在一個讀寫比較頻繁的系統(tǒng)中,建議關閉緩存,因為緩存更新會加鎖。將query_cache_type設置為off,query_cache_size設置為0

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

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

怎么掌握mysql查詢優(yōu)化和分庫分表

怎么掌握mysql查詢優(yōu)化和分庫分表

怎么掌握mysql查詢優(yōu)化和分庫分表

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

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

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

    怎么掌握mysql查詢優(yōu)化和分庫分表

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

    怎么掌握mysql查詢優(yōu)化和分庫分表怎么掌握mysql查詢優(yōu)化和分庫分表

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

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)順序;

 怎么掌握mysql查詢優(yōu)化和分庫分表

  2、將外連接轉(zhuǎn)換為內(nèi)連接;

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

怎么掌握mysql查詢優(yōu)化和分庫分表

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

 怎么掌握mysql查詢優(yōu)化和分庫分表

  5、將一個表達式轉(zhuǎn)換為常數(shù);
  6、子查詢優(yōu)化;

怎么掌握mysql查詢優(yōu)化和分庫分表

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

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

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

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

set profiling = 1; #啟動profile,這是一個session級的配制執(zhí)行查詢

show profiles; # 查詢每一個查詢所消耗的總時間的信息

show profiles for query N; # 查詢的每個階段所消耗的時間

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

啟動監(jiā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%';

怎么掌握mysql查詢優(yōu)化和分庫分表

   怎么掌握mysql查詢優(yōu)化和分庫分表

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

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

    怎么掌握mysql查詢優(yōu)化和分庫分表怎么掌握mysql查詢優(yōu)化和分庫分表

1.6.2 大表的結(jié)構(gòu)修改

   怎么掌握mysql查詢優(yōu)化和分庫分表

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

  2. (推薦)

添加一個新表(修改后的結(jié)構(gòu)),老表數(shù)據(jù)導入新表,老表建立觸發(fā)器,修改數(shù)據(jù)同步到新表, 老表加一個排它鎖(重命名), 新表重命名, 刪除老表。

怎么掌握mysql查詢優(yōu)化和分庫分表

修改語句這個樣子:

alter table sbtest4 modify c varchar(150) not null default ''

利用工具修改:

 怎么掌握mysql查詢優(yōu)化和分庫分表

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

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

 怎么掌握mysql查詢優(yōu)化和分庫分表

二、分庫分表

2.1 分庫分表的幾種方式

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

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

怎么掌握mysql查詢優(yōu)化和分庫分表

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

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

怎么掌握mysql查詢優(yōu)化和分庫分表

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

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

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

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

怎么掌握mysql查詢優(yōu)化和分庫分表

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

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

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

    怎么掌握mysql查詢優(yōu)化和分庫分表

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

感謝各位的閱讀,以上就是“怎么掌握mysql查詢優(yōu)化和分庫分表”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對怎么掌握mysql查詢優(yōu)化和分庫分表這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI