MySQL性能管理及架構設計(一):什么影響了數據庫查詢速度、什么影響了MySQL性能

一、什么影響了數據庫查詢速度

1.1 影響數據庫查詢速度的四個因素

image
image.gif

?

1.2 風險分析

QPS:Queries Per Second意思是“每秒查詢率”,是一臺服務器每秒能夠相應的查詢次數,是對一個特定的查詢服務器在規定時間內所處理流量多少的衡量標準。 TPS:是TransactionsPerSecond的縮寫,也就是事務數/秒。它是軟件測試結果的測量單位。客戶機在發送請求時開始計時,收到服務器響應后結束計時,以此來計算使用的時間和完成的事務個數。

Tips:最好不要在主庫上數據庫備份,大型活動前取消這樣的計劃。

  1. 效率低下的sql:超高的QPS與TPS。

  2. 大量的并發:數據連接數被占滿(max_connection默認100,一般把連接數設置得大一些)。 并發量:同一時刻數據庫服務器處理的請求數量

  3. 超高的CPU使用率:CPU資源耗盡出現宕機。

  4. 磁盤IO:磁盤IO性能突然下降、大量消耗磁盤性能的計劃任務。解決:更快磁盤設備、調整計劃任務、做好磁盤維護。

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

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

點擊與我交流企鵝群.

1.3 網卡流量:如何避免無法連接數據庫的情況

  1. 減少從服務器的數量(從服務器會從主服務器復制日志)

  2. 進行分級緩存(避免前端大量緩存失效)

  3. 避免使用select * 進行查詢

  4. 分離業務網絡和服務器網絡

1.4 大表帶來的問題(重要)

1.4.1 大表的特點

  1. 記錄行數巨大,單表超千萬

  2. 表數據文件巨大,超過10個G

1.4.2 大表的危害

1.慢查詢:很難在短時間內過濾出需要的數據 查詢字區分度低 -> 要在大數據量的表中篩選出來其中一部分數據會產生大量的磁盤io -> 降低磁盤效率

2.對DDL影響:

建立索引需要很長時間:

  • MySQL -v<5.5 建立索引會鎖表

  • MySQL -v>=5.5 建立索引會造成主從延遲(mysql建立索引,先在組上執行,再在庫上執行)

修改表結構需要長時間的鎖表:會造成長時間的主從延遲('480秒延遲')

1.4.3 如何處理數據庫上的大表

分庫分表把一張大表分成多個小表

難點:

  1. 分表主鍵的選擇

  2. 分表后跨分區數據的查詢和統計

1.5 大事務帶來的問題(重要)

1.5.1 什么是事務

image
image.gif

?

1.5.2事務的ACID屬性

1、原子性(atomicity):全部成功,全部回滾失敗。銀行存取款。 2、一致性(consistent):銀行轉賬的總金額不變。 3、隔離性(isolation):

隔離性等級:

  • 未提交讀(READ UNCOMMITED) 臟讀,兩個事務之間互相可見;-- 存在臟讀、不可重復讀、幻讀的問題

  • 已提交讀(READ COMMITED)符合隔離性的基本概念,一個事務進行時,其它已提交的事物對于該事務是可見的,即可以獲取其它事務提交的數據(不可重復讀)。-- 解決臟讀的問題,存在不可重復讀、幻讀的問題。

  • 可重復讀(REPEATABLE READ) InnoDB的默認隔離等級。事務進行時,其它所有事務對其不可見,即多次執行讀,得到的結果是一樣的! -- mysql 默認級別,解決臟讀、不可重復讀的問題,存在幻讀的問題。使用 MVCC(多版本并發控制,提高并發,不加鎖)機制 實現可重復讀。But,MySQL在可重復讀級別已經解決幻讀,插不進數據,有間隙鎖。

  • 可串行化(SERIALIZABLE) 在讀取的每一行數據上都加鎖,會造成大量的鎖超時和鎖征用,嚴格數據一致性且沒有并發是可使用。 -- 解決臟讀、不可重復讀、幻讀,可保證事務安全,但完全串行執行,性能最低。

不可重復讀:事務A首先讀取了一條數據,然后執行邏輯的時候,事務B將這條數據改變了,然后事務A再次讀取的時候,發現數據不匹配了,就是所謂的不可重復讀了。 也就是說,當前事務先進行了一次數據讀取,然后再次讀取到的數據是別的事務修改成功的數據,導致兩次讀取到的數據不匹配,也就照應了不可重復讀的語義。 幻讀:事務A首先根據條件索引得到N條數據,然后事務B改變了這N條數據之外的M條或者增添了M條符合事務A搜索條件的數據,導致事務A再次搜索發現有N+M條數據了,就產生了幻讀。 也就是說,當前事務讀第一次取到的數據比后來讀取到數據條目少。 不可重復讀和幻讀比較: 兩者有些相似,但是前者針對的是update或delete,后者針對的insert。

查看系統的事務隔離級別:show variables like '%iso%'; 開啟一個新事務:begin; 提交一個事務:commit; 修改事物的隔離級別:set session tx_isolation='read-committed';

4、持久性(DURABILITY):從數據庫的角度的持久性,磁盤損壞就不行了

image
image.gif

?

redo log機制保證事務更新的一致性和持久性

1.5.3 大事務

運行時間長,操作數據比較多的事務;

風險:鎖定數據太多,回滾時間長,執行時間長。

  1. 鎖定太多數據,造成大量阻塞和鎖超時;

  2. 回滾時所需時間比較長,且數據仍然會處于鎖定;

  3. 如果執行時間長,將造成主從延遲,因為只有當主服務器全部執行完寫入日志時,從服務器才會開始進行同步,造成延遲。

解決思路:

  1. 避免一次處理太多數據,可以分批次處理;

  2. 移出不必要的SELECT操作,保證事務中只有必要的寫操作。

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

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

點擊與我交流企鵝群.

二、什么影響了MySQL性能(非常重要)

2.1 影響性能的幾個方面

  1. 服務器硬件。

  2. 服務器系統(系統參數優化)。

  3. 存儲引擎。 MyISAM: 不支持事務,表級鎖。 InnoDB: 支持事務,支持行級鎖,事務ACID。

  4. 數據庫參數配置。

  5. 數據庫結構設計和SQL語句。(重點優化)

2.2 MySQL體系結構

分三層:客戶端->服務層->存儲引擎

image
image.gif

?

  1. MySQL是插件式的存儲引擎,其中存儲引擎分很多種。只要實現符合mysql存儲引擎的接口,可以開發自己的存儲引擎!

  2. 所有跨存儲引擎的功能都是在服務層實現的。

  3. MySQL的存儲引擎是針對表的,不是針對庫的。也就是說在一個數據庫中可以使用不同的存儲引擎。但是不建議這樣做。

2.3 InnoDB存儲引擎

MySQL5.5及之后版本默認的存儲引擎:InnoDB。

2.3.1 InnoDB使用表空間進行數據存儲。

show variables like 'innodb_file_per_table

如果innodb_file_per_table 為 ON 將建立獨立的表空間,文件為tablename.ibd;

如果innodb_file_per_table 為 OFF 將數據存儲到系統的共享表空間,文件為ibdataX(X為從1開始的整數);

.frm :是服務器層面產生的文件,類似服務器層的數據字典,記錄表結構。

2.3.2 (MySQL5.5默認)系統表空間與(MySQL5.6及以后默認)獨立表空間

1.1 系統表空間無法簡單的收縮文件大小,造成空間浪費,并會產生大量的磁盤碎片。

1.2 獨立表空間可以通過optimeze table 收縮系統文件,不需要重啟服務器也不會影響對表的正常訪問。

2.1 如果對多個表進行刷新時,實際上是順序進行的,會產生IO瓶頸。

2.2 獨立表空間可以同時向多個文件刷新數據。

強烈建立對Innodb 使用獨立表空間,優化什么的更方便,可控。

2.3.3 系統表空間的表轉移到獨立表空間中的方法

1、使用mysqldump 導出所有數據庫數據(存儲過程、觸發器、計劃任務一起都要導出 )可以在從服務器上操作。

2、停止MYsql 服務器,修改參數(my.cnf加入innodb_file_per_table),并刪除Inoodb相關文件(可以重建Data目錄)。

3、重啟MYSQL,并重建Innodb系統表空間。

4、 重新導入數據。

或者 Alter table 同樣可以的轉移,但是無法回收系統表空間中占用的空間。

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

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

點擊與我交流企鵝群.

2.4 InnoDB存儲引擎的特性

2.4.1 特性一:事務性存儲引擎及兩個特殊日志類型:Redo Log 和 Undo Log

  1. Innodb 是一種事務性存儲引擎。

  2. 完全支持事務的ACID特性。

  3. 支持事務所需要的兩個特殊日志類型:Redo Log 和Undo Log

Redo Log:實現事務的持久性(已提交的事務)。 Undo Log:未提交的事務,獨立于表空間,需要隨機訪問,可以存儲在高性能io設備上。

Undo日志記錄某數據被修改前的值,可以用來在事務失敗時進行rollback;Redo日志記錄某數據塊被修改后的值,可以用來恢復未寫入data file的已成功事務更新的數據。

2.4.2 特性二:支持行級鎖

  1. InnoDB支持行級鎖。

  2. 行級鎖可以最大程度地支持并發。

  3. 行級鎖是由存儲引擎層實現的。

2.5 什么是鎖

2.5.1 鎖

image
image.gif

?

2.5.2 鎖類型

image
image.gif

?

S鎖(讀鎖): select ... lock in share mode X鎖(寫鎖):select ... for update (update、delete、)

2.5.3 鎖的粒度

MySQL的事務支持不是綁定在MySQL服務器本身,而是與存儲引擎相關

image
image.gif

?

將table_name加表級鎖命令:lock table table_name write; 寫鎖會阻塞其它用戶對該表的‘讀寫’操作,直到寫鎖被釋放:unlock tables;

  1. 鎖的開銷越大,粒度越小,并發度越高。

  2. 表級鎖通常是在服務器層實現的。

  3. 行級鎖是存儲引擎層實現的。innodb的鎖機制,服務器層是不知道的

2.5.4 鎖的分類

(1)悲觀鎖

總是假設最壞的情況,每次拿數據都認為別人會修改數據,所以要加鎖,別人只能等待,直到我釋放鎖才能拿到鎖;數據庫的行鎖、表鎖、讀鎖、寫鎖都是這種方式,java中的synchronized和ReentrantLock也是悲觀鎖的思想。

(2)樂觀鎖

總是假設最好的情況,每次拿數據都認為別人不會修改數據,所以不會加鎖,但是更新的時候,會判斷在此期間有沒有人修改過;一般基于版本號機制實現。

(3)使用場景

樂觀鎖適用于讀多寫少的情況,即沖突很少發生;如果是多寫的情況,應用會不斷重試,反而會降低系統性能,這種情況最好用悲觀鎖,因為等待到鎖被釋放后,可以立即獲得鎖進行操作。

拓展: (1)圖解悲觀鎖和樂觀鎖 (2)什么是樂觀鎖與悲觀鎖?

2.5.4 阻塞和死鎖

(1)阻塞是由于資源不足引起的排隊等待現象。 (2)死鎖是由于兩個對象在擁有一份資源的情況下申請另一份資源,而另一份資源恰好又是這兩對象正持有的,導致兩對象無法完成操作,且所持資源無法釋放。

2.6 如何選擇正確的存儲引擎

參考條件:

  1. 事務

  2. 備份(Innobd免費在線備份)

  3. 崩潰恢復

  4. 存儲引擎的特有特性

總結:Innodb大法好。 注意:盡量別使用混合存儲引擎,比如回滾會出問題在線熱備問題。

2.7 配置參數

2.7.1 內存配置相關參數

確定可以使用的內存上限。

<pre>內存的使用上限不能超過物理內存,否則容易造成內存溢出;(對于32位操作系統,MySQL只能試用3G以下的內存。)</pre>

確定MySQL的每個連接單獨使用的內存。

<pre>sort_buffer_size #定義了每個線程排序緩存區的大小,MySQL在有查詢、需要做排序操作時才會為每個緩沖區分配內存(直接分配該參數的全部內存); join_buffer_size #定義了每個線程所使用的連接緩沖區的大小,如果一個查詢關聯了多張表,MySQL會為每張表分配一個連接緩沖,導致一個查詢產生了多個連接緩沖; read_buffer_size #定義了當對一張MyISAM進行全表掃描時所分配讀緩沖池大小,MySQL有查詢需要時會為其分配內存,其必須是4k的倍數; read_rnd_buffer_size #索引緩沖區大小,MySQL有查詢需要時會為其分配內存,只會分配需要的大小。</pre>

注意:以上四個參數是為一個線程分配的,如果有100個連接,那么需要×100。

MySQL數據庫實例: ①MySQL是單進程多線程(而oracle是多進程),也就是說MySQL實例在系統上表現就是一個服務進程,即進程;  ②MySQL實例是線程和內存組成,實例才是真正用于操作數據庫文件的; 一般情況下一個實例操作一個或多個數據庫;集群情況下多個實例操作一個或多個數據庫。

如何為緩存池分配內存: Innodb_buffer_pool_size,定義了Innodb所使用緩存池的大小,對其性能十分重要,必須足夠大,但是過大時,使得Innodb 關閉時候需要更多時間把臟頁從緩沖池中刷新到磁盤中;

<pre>總內存-(每個線程所需要的內存*連接數)-系統保留內存</pre>

key_buffer_size,定義了MyISAM所使用的緩存池的大小,由于數據是依賴存儲操作系統緩存的,所以要為操作系統預留更大的內存空間;

<pre>select sum(index_length) from information_schema.talbes where engine='myisam'</pre>

注意:即使開發使用的表全部是Innodb表,也要為MyISAM預留內存,因為MySQL系統使用的表仍然是MyISAM表。

max_connections 控制允許的最大連接數, 一般2000更大。 不要使用外鍵約束保證數據的完整性。

2.8 性能優化順序

從上到下:

image
image.gif

?

喜歡我的文章就關注我吧,持續更新中.....

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要的可以點擊進入暗號:知乎

推薦下一篇:

MySQL性能管理及架構設計(二):數據庫結構優化、高可用架構設計、數據庫索引優化

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,892評論 2 372