MYSQL 經常使用的引擎主要有一下幾種,MRG_MYISAM 、CSV 、MyISAM、InnoDB、MEMORY ,NDB,其中MyISAM、InnoDB是mysql最經常使用的存儲引擎,今天主要討論 InnoDB引擎。mysql
1、什麼是InnoDB引擎算法
InnoDB引擎是MYSQL數據庫的另外一個重要的額存儲引擎,正成爲目前MYSQL AB全部發行新版的標準,被包含在全部二進制安裝包裏。sql
和其餘的存儲引擎相比,InnoDB引擎的優勢支持兼容ACID的事物,以及參數完整性(即對外建的支持)。數據庫
MYSQL5.5.5之後數據庫的默認存儲引擎爲InnoDB引擎緩存
2、InnoDB引擎的特色安全
一、支持事物:支持4個事物隔離級別,支持多版本讀(ACID :原子性、一致性、隔離性、持久性.)數據結構
二、行級鎖定(更新時通常是鎖定當前行,InnoDB鎖定在行級而且也在SELECT語句提供一個Oracle風格一致的非 鎖定讀):經過索引實現,全表掃描仍然會是鎖表。架構
三、讀寫阻塞與事物隔離級別有關併發
四、具備很是高效的緩存特性:能緩存索引,也能緩存數據(InnoDB存儲引擎爲在主內存中緩存數據和索引而維持它本身的緩衝池。 InnoDB存儲它的表&索引在一個表空間中,表空間能夠包含多個文件(或原始磁盤分區))oracle
五、整個表和主鍵以Cluster方式存儲,組成一顆平衡樹
六、全部Secondar Index都會保存主鍵信息
七、支持分區,表空間,相似oracle數據庫
八、支持外鍵約束,5.5版本之後支持全文索引
3、事務的四大特性(ACID)
一、原子性
事務是一個不可分割的單位,事務中的全部SQL燈操做要麼都發生,要麼都不發生.
二、一致性
事務發生以前和發生以後,數據的完整性必須保持一致.
三、隔離性
當併發訪問數據庫時,一個正在執行的事務在執行完畢前,對於其餘的會話是不可見的,多個併發事務之間的數據相互隔離的。
四、持久性
一個事務一旦被提交,它對數據庫中的數據改變就是永久性的,若是出了錯誤,事務也不容許撤銷,只能經過「補償性事務」.
4、InnoDB引擎架構
InnoDB的多個內存塊組成了內存池,負責以下工做:
一、維護全部進程/線程須要訪問的多個內部數據結構。
二、緩存磁盤上的數據,方便快速的讀取,而且在對磁盤文件的數據進行修改以前在這裏緩存。
三、重作日誌緩存。
後臺線程的主要做用是負責刷新內存池中的數據,保證緩衝池中的內存緩存是最近的數據,此外、將已經修改的數據文件刷 新到磁盤文件
後臺線程
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引擎適用的生產業務場景
一、須要事務支持的業務(具備較好的食物特性)
二、行級鎖定對高併發有很好的適應能力,但須要確保查詢是經過索引完成
三、數據更新較爲頻繁的場景
四、數據一致性要求較高的業務
五、硬件設備內存較大,能夠利用InnoDB較好的緩存能力來提升內存利用率,儘量減小磁盤IO
6、INNODB表空間
默認表空間文件爲ibdata1文件innodb_data_file_path存儲數據,innodb_file_per_table能夠按表分別產生一個表空間.db文件,但僅存該表的
數據索引和插入緩衝等信息,其餘信息如undo信息,系統事務信息,double write buffer等仍是存放在默認表空間(ibdata1或表空間組)裏。
7、關鍵特性,爲innodb提升性能的技術
一、插入緩存
當一個表有非彙集索引時,對於非彙集索引的葉子節點的插入不是順序的,這時候須要離散的訪問非彙集索引頁,性能就在這裏降
低了,這是因爲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數據庫可能宕機,並把錯誤寫入錯誤日誌中。
8、InnoDB引擎調優精要
一、主鍵儘量小,避免給Secondar Index帶來過大的空間負擔
二、避免全表掃描,由於會使用表級鎖
三、儘量緩存全部的索引和數據。,提升響應速度,減小磁盤IO消耗
四、在大批量插入的時候,儘可能本身控制事物而不要使用autocommit自動提交有開關能夠控制提交方式
【 取消自動提交事物
mysql> set global init_connect="set autocommit=0";
init_connect='SET autocommit=0' // 在mysqld裏面加上這些內容
】
五、合理設置innodb_flush_log_at_trx_commit參數值,不要過分追求安全性、
(若是innodb_flush_log_at_trx_commit=0 log buffer 每秒就會被刷寫日誌文件到磁盤,提交事物的時候不作任何操做)
6避免主鍵更新,由於這會帶來大量的數據移動
9、生產環境中如何批量更改mysql引擎
alter table table_name ENGINE = INNODB
10、InnoDB與MYISAM區別總結
1.InnoDB不支持FULLTEXT類型的索引。
2.InnoDB 中不保存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行數便可。注意的是,當count(*)語句包含 where條件時,兩種表的操做是同樣的。
在執行數據庫寫入的操做(insert,update,delete)的時候,mysiam表會鎖表,而innodb表會鎖行。通俗點說,就是你執行了一個update語句,那麼mysiam表會將整個表都鎖住,其餘的insert和delete、update都會被拒之門外,等到這個update語句執行完成後纔會被依次執行
另外,InnoDB表的行鎖也不是絕對的,若是在執行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表,例如update table set num=1 where name like 「%aaa%」
3.對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引,可是在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。
4.DELETE FROM table時,InnoDB不會從新創建表,而是一行一行的刪除。
5.LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。
11、InnoDB與MYISAM如何選擇
當你的數據庫有大量的寫入、更新操做而查詢比較少或者數據完整性要求比較高的時候就選擇innodb表。當你的數據庫主要以查詢爲主,相比較而言更新和寫入比較少,而且業務方面數據完整性要求不那麼嚴格,就選擇mysiam表。由於mysiam表的查詢操做效率和速度都比innodb要快。