MySQL多線程併發調優

前言

學習MySQL數據庫技術,一個很是重要的技能就是性能調優。一般狀況下,都是自下而上的調優方法,主要包括運行環境、配置參數、SQL性能和系統架構設計調優等。mysql

本文從多線程併發的角度進行的思考,簡單描述MySQL併發參數及其調優。sql

MySQL併發模型

架構

mysql_arch

Innodb用本身的線程調度機制來控制線程如何進入innodb內核工做,並執行相關的操做。數據庫

  • 當一個線程須要進入到Innodb存儲引擎層(如下簡稱Innodb),Innodb會檢查已經進入到Innodb存儲引擎層的線程總數是否超過innodb_thread_concurrency;多線程

    • 若是超過了,則該線程須要等待innodb_thread_sleep_delay毫秒再次進行嘗試;
    • 若是嘗試仍然失敗,該線程將會進入到FIFO的隊列中進行等待喚醒(此時狀態爲sleeping)。
  • 一旦該thread進入到INNODB中,該線程將會得到innodb_concurrency_tickets次通行證,即該線程在接下來的innodb_concurrency_tickets次進入到INNODB中都不須要再進行檢查,可直接進入。
  • 線程嘗試兩次進入INNODB存儲引擎層的目的是,減小等待線程的數量以及減小上下文切換。

Innodb的這種兩階段的機制減小了操做系統由於線程之間的上下文切換帶來的開銷。架構

Innodb concurrency相關參數

  • innodb_thread_concurrency併發

    • 同一時刻可以進入innodb層併發執行的線程數量。若是超過CPU核數,某些線程就會處於就緒狀態;若Server層線程數超過這個數值,多餘的線程會被放到wait queue隊列中等待;
    • 默認值:0,表示不限制線程併發執行的數量,全部請求都會被認爲是可調度的。此時,innodb_thread_sleep_delay的值會被忽略
    • 範圍:0 ~ 1000
  • innodb_commit_concurrency性能

    • 同一時刻容許同時commit的線程數量
    • 默認值:0,即不限制
    • 範圍:0 ~ 1000
    • 若是 innodb_thread_concurrency 設置的有點大innodb_commit_concurrency應該作出相應的調整,不然會形成大量線程阻塞。
  • innodb_concurrency_tickets學習

    • thread進入INNODB中,會得到innodb_concurrency_tickets次通行,該線程在接下來的innodb_concurrency_tickets次進入到INNODB中不須要再進行檢查,可直接進入。
    • 默認值:5000
    • 範圍:0 ~ 4294967295
  • innodb_thread_sleep_delayspa

    • 線程未能進入INNODB存儲引擎,須要等待innodb_thread_sleep_delay毫秒再次嘗試進入;即進入wait queue前sleep的時間;
    • 單位:微妙
    • 默認值:10000
相關文章
相關標籤/搜索