Mysql 體系結構 和 存儲引擎

前言:數據庫的引擎是整個mysql數據庫的核心組件,mysql的存儲引擎衆多,MyISAM、InnoDB、Memory、Archive等,其中InnoDB是mysql裏面支持事務類型的一個存儲引擎最好的一個,雅虎、facebook、youtube、淘寶、谷歌用的mysql數據庫都有用到InnoDB的存儲引擎; mysql

在數據庫領域中有2個詞很容易混淆,「實例」  和 「數據庫」;算法

數據庫:物理操做系統文件或其餘形式文件類型的集合;在mysql 中,數據庫能夠是 frm、myd、myi、ibd 結尾的文件。當使用 NDB引擎時,數據庫的文件 可能 不是操做系統上的 文件,而是 存放於內存之中的文件,可是定義仍然不變。sql

數據庫實例:由數據庫後臺進程/線程以及一個共享內存區組成,共享內存能夠被運行的後臺進程/線程所共享,須要牢記的是,數據庫實例纔是 真正用來操做數據庫文件的。數據庫

更加直白的解釋:windows

數據庫是由一個個文件組成(通常來講是二進制文件),若是要對這些文件執行諸如 select 、insert、update、delete 之類的操做,不能經過簡單的操做文件來更改數據庫的內容,須要經過數據庫實例來完成對數據庫的操做。緩存

在mysql 中,實例和數據庫的 一般關係是一 一 對應,即一個實例對應一個數據庫,一個數據庫對應一個實例.在集羣狀況下,可能存在一個數據庫被多個實例使用的狀況.數據結構

由上圖能夠發現,mysql 由 如下幾個部分組成:oracle

鏈接池組件、管理服務 和 工具組件、SQL接口組件、查詢分析器組件、優化器組件、緩衝組件、插件式存儲引擎、物理文件。工具

注意:存儲引擎是 基於 表的,而不是基於數據庫的;存儲引擎是 myql 區別於其餘數據庫的一個最重要的特性。存儲引擎的好處是,每一個存儲引擎都有各自的特色,可以根據具體的應用 創建不一樣的 存儲 引擎表,mysql 的 核心就是 存儲引擎。優化

InnoDB 存儲引擎

InnoDB 存儲引擎 支持事務,主要面向在線事務處理方面的應用。其特色是 行鎖設計、支持外鍵,並支持相似與 oracle 的 非鎖定讀,即默認狀況下,讀取操做不會產生鎖。mysql 在 windows 版本下的 InnoDB 是默認的存儲引擎,同時,InnoDB 默認的被包含在全部 Mysql 二進制發佈版本中。

MyISAM 存儲引擎

MyISAM 存儲引擎是 mysql 官方提供的 存儲引擎,特色是 不支持事務、表鎖 和 全文索引,對於一些在線分析處理操做速度快,除了 windows 版本外,是全部 Mysql 版本 默認的 存儲引擎。

查看使用的 mysql 所涵蓋的 存儲引擎命令: show engines\G;

改變 某個表的 存儲引擎 命令:alter table mytest engine=innodb;

InnoDB 存儲引擎 體系結構

InnoDB內存數據對象:數據頁(undo page)、索引頁(index page)、插入緩衝(insert buffer)、自適應哈希索引(adaptive hash index)、鎖信息(lock info)、數據字典信息(data dictionary)、重作日誌緩衝(redo log_buffer)、額外內存池(innodb_additional_mem_pool_size)。

 innodb的內存的做用大體以下:

  • 緩存磁盤上的數據,方便快速的讀取;
  • 對磁盤文件的數據進行修改以前在這裏緩存;
  • 應用所做的日誌的緩存;
  • 內存結構自身的管理結構;

內存結構根據功能能夠分紅三部分:Innodb buffer pooladditional buffer poollog buffer;

Innodb buffer pool:緩衝池,從圖上能夠看到buffer pool佔用最大塊的內存部分,主要用來各類數據的緩衝。innodb將數據文件按頁(16K)讀取到緩衝池,而後按最少使用(LRU)算法來保留緩存數據;數據文件修改時,先修改緩存池中的頁(即髒頁),而後按必定平率將髒頁刷新到文件;

查看mysql 內存的 分配狀況:

mysql> show variables like 'innodb_%_size';
+---------------------------------+-----------+
| Variable_name                   | Value     |
+---------------------------------+-----------+
| innodb_additional_mem_pool_size | 3145728   |
| innodb_buffer_pool_size         | 112197632 |
| innodb_log_buffer_size          | 2097152   |
| innodb_log_file_size            | 56623104  |
| innodb_purge_batch_size         | 20        |
+---------------------------------+-----------+
innodb_additional_mem_pool_size  的 大小:3145728/1024/1024 = 3 M

innodb_buffer_pool_size    的大小:112197632 /1024/1024 = 107M

innodb_log_buffer_size  的大小:  2097152 /1024/1024 = 2M

查看 innodb_buffer_pool 的運行使用狀況:
mysql> show engine innodb status\G;

=====================================
161014 10:00:09 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 7 seconds  # 表示過去 7秒內的數據庫的狀態.

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 1
Dictionary memory alloca
Buffer pool size   6848
Free buffers       6414
Database pages     433
Old database pages 0
Modified db pages  0

從 上面能夠看到 innodb 存儲引擎緩衝池的使用狀況.Buffer pool size 代表了一共有多少個緩衝幀(buffer frame),每一個buffer frame 爲 16K,因此,這裏一共分配了
6848 * 16/1024 = 107 M 的內存緩衝池. free buffers:當前空閒的緩衝幀; Database pages:表示已經使用的緩衝幀.Modified db pages:表示髒頁的數量.

Log Buffer:日誌緩衝池(功能跟oracle redo log buffer基本類似),將重作日誌信息放入這個緩衝區,而後按必定頻率將其刷新到重作日誌文件。該值通常不須要設置很大,由於通常狀況下每一秒鐘就會將重作日誌緩衝刷新到日誌文件,所以咱們只須要保證每秒產生的事務量在這個緩衝大小以內便可;

腳本: show variables like ' innodb_log_buffer_size ';   能夠顯示log buffer的大小;

additional buffer pool:額外緩衝池,在對一些數據結構自己分配內存時,須要從額外的內存池中申請,當該區域的內存不夠用時,會從緩衝池中申請。InnoDB 實例會申請緩衝池(innodb_buffer_pool) 的空間,
可是每一個緩衝池中的緩衝幀(frame buffer) 還有對應的緩衝控制對象(buffer control block),並且這些對象記錄了諸如 LRU、鎖、等待等方面的信息,而這個對象的內存須要從額外的內存池中申請。
所以,申請了很大的 InnoDB 緩衝池時,這個值 也會相應的增長。簡單理解爲:額外緩衝池用於管理緩衝池的內容的,因此緩衝池越大額外換池也須要越大;

相關文章
相關標籤/搜索