mysql存儲引擎mysql
1.3.一、innodb存儲引擎,特色支持外鍵、行鎖、非鎖定讀(默認狀況下讀取不會產生鎖)、mysql-4.1開始支持每一個innodb引擎的表單獨放到一個表空間裏。innodb經過使用MVCC來獲取高併發性,而且實現sql標準的4種隔離級別,同時使用一種被稱成next-key locking的策略來避免換讀(phantom)現象。除此以外innodb引擎還提供了插入緩存(insert buffer)、二次寫(double write)、自適應哈西索引(adaptive hash index)、預讀(read ahead)等高性能技術。算法
1.3.二、myisam存儲引擎,myisam特色是不支持事物,適合olap應用,myisam表由MYD和MYI組成。mysql-5.0版本以前,myisam默認支持的表大小爲4G,從mysql-5.0之後,myisam默認支持256T的表單數據。myisam只緩存索引數據。sql
1.3.三、NDB存儲引擎,特色是數據放在內存中,mysql-5.1版本開始能夠將非索引數據放到磁盤上。NDB以前的缺陷是join查詢是mysql數據庫層完成的,而不是存儲引擎完成的,複雜的join查詢須要巨大的網絡開銷,速度很慢。當前mysql cluster7.2版本中已經解決此問題,join查詢效率提升了70倍。數據庫
1.3.四、memeory存儲引擎,將數據放到內存中,默認使用hash索引,不支持text和blob類型,varchara是按照char的方式來存儲的。mysql數據庫使用memory存儲引擎做爲臨時表還存儲中間結果集(intermediate result),若是中間集結果大於memorg表的容量設置,又或者中間結果集包含text和blog列類型字段,則mysql會把他們轉換到myisam存儲引擎表而放到磁盤上,會對查詢產生性能影響。緩存
1.3.五、archive存儲引擎,壓縮能力較強,主要用於歸檔存儲。安全
1.3.六、federated存儲引擎,不存儲數據,他指向一臺遠程mysql數據庫上的表。服務器
1.3.七、maria存儲引擎,myisam的後續版本,支持緩存數據和索引,行鎖設計,支持mvcc,支持事務和非事務安全的選項,以及更好的BLOG字符類型的處理性能。網絡
1.3.八、其餘存儲引擎,sphinx用於全文索引,infobright用於數據倉庫。session
1.4.一、TCP/IP:基於網絡的鏈接,鏈接進行權限檢查。數據結構
1.4.二、命名管道和共享內存:Windows系統上同一服務器上的兩進程可經過命名管道鏈接,需在配置文件中啓用--enable-named-pipe選項。
1.4.三、Unix套接字:客戶端與服務端位於同一服務器時纔可以使用,能夠在my.cnf中指定-socket=/tmp/mysql.sock,鏈接時指定./mysql -S/tmp/mysql.sock。
InnoDB的多個內存塊組成了內存池,負責以下工做:
1).維護全部進程/線程須要訪問的多個內部數據結構。
2).緩存磁盤上的數據,方便快速的讀取,而且在對磁盤文件的數據進行修改以前在這裏緩存。
3).重作日誌緩存。
後臺線程的主要做用是負責刷新內存池中的數據,保證緩衝池中的內存緩存是最近的數據,此外、將已經修改的數據文件刷新到磁盤文件
innodb存儲引擎後臺有7個線程,—–4個IO線程(insert buffer thread,log thread,read thread,write thread),1個master thread,一個lock監控線程,一個錯誤監控線程。
innodb存儲引擎內存由如下三個部分組成:緩衝池(buffer pool),重作日誌緩存(redo log buffer),額外的內存池(additional memory pool)。可使用 show engine innodb status來查看innodb_buffer_pool的使用狀況。
innodb_buffer_pool_size:具體看,緩衝池中的數據庫類型有:索引頁、數據庫頁、undo頁、插入緩存頁(insert buffer)、自適應hash(adaptive hashindex)、innodb存儲的鎖信息(lock info)、數據字典信息(data dictionary)。
InnoDB工做方式:將數據文件按頁(每頁16K)讀入InnoDBbuffer pool,而後按最近最少使用算法(LRU)保留緩存數據,最後經過必定頻率將髒頁刷新到文件。
一、因爲硬件的發展,如今的硬件性能已經提升了不少,若是innodb每秒最大刷新100個髒頁,那麼效率會很低,爲了解決這個問題,innodb plugin提供了一個參數innodb_io_capacity,用來表示磁盤IO的吞吐量,默認值是200,規則以下:在合併插入緩存時,合併插入緩存的數量爲innodb_io_capacity的5%;在從緩衝區刷新髒頁時,啥新髒頁的數量爲innodb_io_capacity。
二、關於innodb_max_dirty_pages_pct值的爭議,若是值過大,內存也很大或者服務器壓力很大,那麼效率很下降,若是設置的值太小,那麼硬盤的壓力會增長,建議是在75-80.而且innodb plugin引進了innodb_adaptive_flushng(自適應的刷新),該值影響每秒刷新髒頁的數量。
當一個表有非彙集索引時,對於非彙集索引的葉子節點的插入不是順序的,這時候須要離散的訪問非彙集索引頁,性能就在這裏下降了,這是因爲b+樹的原理致使的。插入緩存就是用來解決這個問題的。
對於非彙集索引的插入和更新操做,不是每一次都直接插入索引頁,而是先判斷插入的非彙集索引頁是否在緩存中,若是在就直接插入,若是不在就放入到一個插入緩衝區中,好似欺騙數據庫這個非彙集索引已經插入到葉子節點了。而後再以必定的頻率插入緩存和非彙集索引頁字節點的合併操做。
插入緩存的使用須要知足如下兩個條件(也就是非惟一的輔助索引):索引是輔助索引;索引不是惟一的。
兩次寫給innodb帶來的是可靠性,主要用來解決部分寫失敗(partial page write)。在應用重作日以前,咱們須要一個頁的副本,當寫入失效發生時,先經過頁的副原本還原該頁,再進行重作,這就是doublewrite。
doublewrite有兩部分組成,一部分是內存中的doublewrite buffer,大小爲2M,另一部分就是物理磁盤上的共享表空間中聯繫的128個頁,即兩個區,大小一樣爲2M。當緩衝池的張也刷新時,並不直接寫硬盤,而是回經過memcpy函數將髒頁先拷貝到內存中的doublewrite buffer,以後經過doublewrite buffer再分兩次寫,每次寫入1M到共享表空間的物理磁盤上,而後立刻調用fsync函數,同步磁盤。
因爲innodb不支持hash索引,可是在某些狀況下hash索引的效率很高,因而出現了 adaptive hash index功能,innodb存儲引擎會監控對錶上索引的查找,若是觀察到創建hash索引能夠提升性能的時候,則自動創建hash索引。
innodb_fast_shutdown影響InnoDB表關閉。該參數有0、一、2三個參數。
0 MySQL關閉時 完成全部的full purge和merge insertbuffer操做
1默認值 只將緩衝池內的一些髒頁刷新至磁盤
2將日誌都寫入日誌文件不會有任何事務丟失但下次啓動時會進行recovery
innodb_force_recovery影響整個innodb存儲引擎的恢復情況,該值默認爲0,表示當須要恢復時,須要執行全部的恢復操做,當不能進行有效恢復時,如數據頁發生了corruption,mysql數據庫可能宕機,並把錯誤寫入錯誤日誌中。
Mysql實例能夠不須要參數文件,這是全部的參數值取決於編譯Mysql時指定的默認值和源代碼中指定參數的默認值。其參數文件是Mysql.cnf。
參數是一個鍵/值對。可使用show variables like命令查看,也能夠經過information_schema的GLOBAL_VARIABLES視圖來查找。
參數文件分爲兩類:動態參數和靜態參數。動態參數意味着你能夠在Mysql實例運行中進行更改;靜態參數說明在整個實例生命週期內都不得進行更改,好像是隻讀的。對於動態參數,又能夠分爲global和session關鍵字,代表該參數的修改是基於當前會話仍是真格實例的生命週期。有些動態參數只能在會話中進行修改,如autocommit;有些參數修改完後,在整個實例生命週期中都會生效,如binlog_cache_size;而有些參數既能夠在會話又能夠在整個實例的生命週期內生效,如read_buffer_size。
錯誤日誌對Mysql的啓動、運行、關閉過程進行了記錄。出現Mysql不能正常啓動時,第一個必須查找的文件應該就是錯誤日誌文件。使用show variables like ‘log_error’來定位文件。
慢查詢能爲SQL語句的優化帶來很好的幫助。設定一個閥值,將運行時間超過該值的全部SQL語句都記錄到慢查詢日誌文件中。用參數long_query_time來設置。另外一個參數log_queries_not_using_indexes,若運行的SQL語句沒有使用索引,則這條SQL語句會被記錄下來。
查詢日誌記錄了全部對Mysql請求的信息,不論這些請求是否獲得正確的執行。默認文件名爲:主機名.log。
二進制記錄了對數據庫執行更改的全部操做,可是不包括SELECT和SHOW操做,還包括了執行時間和更改操做時間。可用來恢復某些數據,同時也能夠用來複制同步遠程數據庫。將binlog_format設置成row,能夠支持事務隔離級別爲READ COMMITTED,以得到更好的併發性。在使用MIXED格式下,mysql採用STATEMENT格式進行二進制日誌文件的記錄,可是有一些狀況下會使用ROW格式,可能的狀況以下:
一、表的存儲引擎爲NDB,這個時候DML操做都會以ROW格式記錄。
二、使用了uuid()、user(),current_user(),found_rows(),row_count(),等不肯定函數。
三、使用了insert delay語句
四、使用了用戶定於的函數(UDF)
五、使用了臨時表(temporary table)
注意:針對系統庫mysql裏面的表發生變化的處理規則以下:
一、 若是採用insert,update,delete直接操做表,則日誌根據binlog_format設定的格式記錄。
二、 若是使用grant,revoke,set password等DCL語句,那麼不管如何都會使用SBR模式記錄。
三、 blockhole引擎不支持row格式,ndb引擎不支持statement格式。
Unix系統下本地鏈接Mysql能夠採用Unix套接字方法,須要一個套接字文件,可使用show variableslike ‘socket’查詢。
pid文件是實例啓動是記錄本身進程ID號的文件,表結構定義文件是以frm爲後綴名的文件,還能夠用來存放視圖的定義。
默認表空間文件爲ibdata1文件innodb_data_file_path存儲數據,innodb_file_per_table能夠按表分別產生一個表空間.db文件,但僅存該表的數據索引和插入緩衝等信息,其餘信息如undo信息,系統事務信息,double write buffer等仍是存放在默認表空間(ibdata1或表空間組)裏。
redo log是在實例或者介質失敗的時候,用來保證數據完整性。每一個innodb存儲引擎至少有一個重作日誌組,每一個重作日誌文件組下至少又2個重作日誌文件,如默認的ib_logfile0、ib_logfile1.爲了獲得更高的可靠性,你能夠設置多個重作鏡像日誌組。
由於重作日誌條目先被寫到日誌緩衝中,而後根據必定條件刷新到磁盤重作日誌文件中。與redo log相關的就是innodb_flush_log_at_trx_commit的值,對innodb的性能影響很大。他有0,1,2三個值,0表明提交事務時,並不一樣步寫redo log,而是等master threas每秒寫。1表明commit的時候就將redo log緩存寫入磁盤,2表明commit的時候將redo log緩存異步的寫入磁盤。