標籤:
一、MySQL體繫結構總覽不管是用哪種資料庫,瞭解資料庫的體繫結構都是極為重要的。MySQL體繫結構主要由資料庫和資料庫執行個體構成。
資料庫:物理作業系統檔案或者其它檔案的集合,在mysql中,資料庫檔案可以是frm、myd、myi、ibd等結尾的檔案,當使用ndb儲存引擎時候,不是os檔案,是存放於記憶體中的檔案。
資料庫執行個體:由資料庫後台進程/線程以及一個共用記憶體區組成,共用記憶體可以被啟動並執行後台進程/線程所共用。
以下為MySQL資料庫的體繫結構:
最上層的服務並不是MySQL所專屬的,大多數基與網路的用戶端/伺服器端工具或者服務都有類似的架構。比如串連處理、授權認證、安全等等。
第二層架構大多數MySQL核心服務功能都在這一層,包括查詢解析、分析、最佳化、緩衝以及所有的內建函數(例如,日期、時間、數學和加密函數),所有跨存粗引擎的功能都在這一層實現:預存程序、觸發器、視圖等。
第三層包含了儲存引擎。儲存引擎負責MySQL中資料的儲存和提取。和GNU/Linux下的各種檔案系統一樣,每個儲存引擎都有它的優勢和劣勢。伺服器通過API與儲存引擎進行通訊。這些介面屏蔽了不同儲存引擎之間的差異,使得這些差異對上層的查詢過程透明。儲存引擎API包含幾十個底層函數,用於執行諸如“開始一個事務”或者“根據主鍵提取一行記錄”等操作。但儲存引擎不會去解析SQL,不同儲存引擎之間也不會相互連信,而只是簡單地響應上層伺服器端請求。
二、資料庫後台線程預設情況下講述的InnoDB儲存引擎,以後不再重複聲明。後台線程有7個——4個IO thread,1個master thread,1個鎖監控線程,1個錯誤監控線程。IO thread的數量由設定檔中的innodb_file_io_threads參數控制,預設為4。4個IO線程分別是insert buffer thread、log thread、read thread、write thread。
在MySQL 5.6.10中,MySQL企業版MySQL的包括線程池,使用伺服器外掛程式來實現。在MySQL伺服器的預設線程處理模型使用執行每個用戶端串連一個線程語句。隨著越來越多的用戶端串連到伺服器和執行語句,整體效能降低。線程池的外掛程式提供了旨在減少開銷,提高效能的其他線程的處理模式。該外掛程式實現了通過有效地管理語句執行線程的大量用戶端串連的提高伺服器效能的線程池。
InnoDB Plugin版本開始增加了預設IO thread的數量,預設的read thread和write thread分別增大到了4個,並且不再使用innodb_file_io_threads參數,而是分別使用innodb_read_io_threads和innodb_write_io_threads參數。
線程池解決每個串連模型解決單線程的幾個問題:
(原話也在其中,怕翻譯錯了。)
- 過大的線程堆棧導致處理器快取在高並發工作負載下幾乎是無用。線程池促進線程堆棧重用,以盡量減少處理器快取。
Too many thread stacks make CPU caches almost useless in highly parallel execution workloads. The thread pool promotes thread stack reuse to minimize the CPU cache footprint.
- 伴隨著過多的線程並發調用,環境切換帶來大量的效能消耗。與此同時對於作業系統任務調度也是富有挑戰的任務。線程池控制著活躍線程數,以確保MySQL伺服器內部保持高並髮狀態,同時操控並使伺服器適應MySQL的運轉。
With too many threads executing in parallel, context switching overhead is high. This also presents a challenging task to the operating system scheduler. The thread pool controls the number of active threads to keep the parallelism within the MySQL server at a level that it can handle and that is appropriate for the server host on which MySQL is executing.
- 並發執行導致過多的事務競爭資源。在InnoDB中,導致了花在互斥的時間增加。一旦事務開啟,線程池將控制不會有太多並發執行。
Too many transactions executing in parallel increases resource contention. In InnoDB, this increases the time spent holding central mutexes. The thread pool controls when transactions start to ensure that not too many execute in parallel.
三、資料庫記憶體InnoDB儲存引擎記憶體由以下幾個部分組成:緩衝池(buffer pool)、重做日誌緩衝池(redo log buffer)以及額外的記憶體池(additional memory pool),分別由設定檔中的參數innodb_buffer_pool_size和innodb_log_buffer_size的大小決定。
來自為知筆記(Wiz)
MySQL學習筆記-MySQL體繫結構