innodb

InnoDB,是MySQL的數(shù)據(jù)庫引擎之一,為MySQL AB發(fā)布binary的標(biāo)準(zhǔn)之一。InnoDB由Innobase Oy公司所開發(fā),2006年五月時由甲骨文公司并購。與傳統(tǒng)的ISAM與MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事務(wù)(Transaction)功能,類似于PostgreSQL。

目前InnoDB采用雙軌制授權(quán),一是GPL授權(quán),另一是專有軟件授權(quán)。

innodb基本信息

中文名稱 innodb 外文名稱 innodb
類型 mysql數(shù)據(jù)庫引擎 開發(fā)公司 Innobase Oy公司
特色 支持了ACID兼容的事務(wù) 授權(quán) GPL授權(quán),專有軟件授權(quán)

innodb造價信息

市場價 信息價 詢價
材料名稱 規(guī)格/型號 市場價
(除稅)
工程建議價
(除稅)
行情 品牌 單位 稅率 供應(yīng)商 報價日期
暫無數(shù)據(jù)
材料名稱 規(guī)格/型號 除稅
信息價
含稅
信息價
行情 品牌 單位 稅率 地區(qū)/時間
暫無數(shù)據(jù)
材料名稱 規(guī)格/需求量 報價數(shù) 最新報價
(元)
供應(yīng)商 報價地區(qū) 最新報價時間
暫無數(shù)據(jù)

innodb常見問題

頁級:引擎 BDB。

表級:引擎 MyISAM , 理解為鎖住整個表,可以同時讀,寫不行

行級:引擎 INNODB , 單獨的一行記錄加鎖

表級,直接鎖定整張表,在你鎖定期間,其它進(jìn)程無法對該表進(jìn)行寫操作。如果你是寫鎖,則其它進(jìn)程則讀也不允許

行級,,僅對指定的記錄進(jìn)行加鎖,這樣其它進(jìn)程還是可以對同一個表中的其它記錄進(jìn)行操作。

頁級,表級鎖速度快,但沖突多,行級沖突少,但速度慢。所以取了折衷的頁級,一次鎖定相鄰的一組記錄。

MySQL 5.1支持對MyISAM和MEMORY表進(jìn)行表級鎖定,對BDB表進(jìn)行頁級鎖定,對InnoDB表進(jìn)行行級鎖定。

對WRITE,MySQL使用的表鎖定方法原理如下:

如果在表上沒有鎖,在它上面放一個寫鎖。

否則,把鎖定請求放在寫鎖定隊列中。

對READ,MySQL使用的鎖定方法原理如下:

如果在表上沒有寫鎖定,把一個讀鎖定放在它上面

否則,把鎖請求放在讀鎖定隊列中。

InnoDB使用行鎖定,BDB使用頁鎖定。對于這兩種存儲引擎,都可能存在死鎖。這是因為,在SQL語句處理期間,InnoDB自動獲得行鎖定和BDB獲得頁鎖定,而不是在事務(wù)啟動時獲得。

行級鎖定的優(yōu)點:

· 當(dāng)在許多線程中訪問不同的行時只存在少量鎖定沖突。

· 回滾時只有少量的更改。

· 可以長時間鎖定單一的行。

行級鎖定的缺點:

· 比頁級或表級鎖定占用更多的內(nèi)存。

· 當(dāng)在表的大部分中使用時,比頁級或表級鎖定速度慢,因為你必須獲取更多的鎖。

· 如果你在大部分?jǐn)?shù)據(jù)上經(jīng)常進(jìn)行GROUP BY操作或者必須經(jīng)常掃描整個表,比其它鎖定明顯慢很多。

· 用高級別鎖定,通過支持不同的類型鎖定,你也可以很容易地調(diào)節(jié)應(yīng)用程序,因為其鎖成本小于行級鎖定。

在以下情況下,表鎖定優(yōu)先于頁級或行級鎖定:

· 表的大部分語句用于讀取。

· 對嚴(yán)格的關(guān)鍵字進(jìn)行讀取和更新,你可以更新或刪除可以用單一的讀取的關(guān)鍵字來提取的一行:

· UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;

· DELETE FROM tbl_name WHERE unique_key_col=key_value;

· SELECT 結(jié)合并行的INSERT語句,并且只有很少的UPDATE或DELETE語句。

· 在整個表上有許多掃描或GROUP BY操作,沒有任何寫操作。

/* ========================= mysql 鎖表類型和解鎖語句 ========================= */

如果想要在一個表上做大量的 INSERT 和 SELECT 操作,但是并行的插入?yún)s不可能時,可以將記錄插入到臨時表中,然后定期將臨時表中的數(shù)據(jù)更新到實際的表里??梢杂靡韵旅顚崿F(xiàn):

代碼如下:

mysql> LOCK TABLES real_table WRITE, insert_table WRITE;

mysql> INSERT INTO real_table SELECT * FROM insert_table;

mysql> TRUNCATE TABLE insert_table;

mysql> UNLOCK TABLES;

行級鎖的優(yōu)點有:

在很多線程請求不同記錄時減少沖突鎖。

事務(wù)回滾時減少改變數(shù)據(jù)。

使長時間對單獨的一行記錄加鎖成為可能。

行級鎖的缺點有:

比頁級鎖和表級鎖消耗更多的內(nèi)存。

鎖是計算機協(xié)調(diào)多個進(jìn)程或線程并發(fā)訪問某一資源的機制,不同的數(shù)據(jù)庫的鎖機制大同小異。由于數(shù)據(jù)庫資源是一種供許多用戶共享的資源,所以如何保證數(shù)據(jù)并發(fā)訪問的一致性、有效性是所有數(shù)據(jù)庫必須解決的一個問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個重要因素。了解鎖機制不僅可以使我們更有效的開發(fā)利用數(shù)據(jù)庫資源,也使我們能夠更好地維護(hù)數(shù)據(jù)庫,從而提高數(shù)據(jù)庫的性能。

MySQL的鎖機制比較簡單,其最顯著的特點是不同的存儲引擎支持不同的鎖機制。

例如,MyISAM和MEMORY存儲引擎采用的是表級鎖(table-level-locking);BDB存儲引擎采用的是頁面鎖(page-level-locking),同時也支持表級鎖;InnoDB存儲引擎既支持行級鎖,也支持表級鎖,默認(rèn)情況下是采用行級鎖。

上述三種鎖的特性可大致歸納如下:

1) 表級鎖:開銷小,加鎖快;不會出現(xiàn)死鎖;鎖定粒度大,發(fā)生鎖沖突的概率最高,并發(fā)度最低。

2) 行級鎖:開銷大,加鎖慢;會出現(xiàn)死鎖;鎖定粒度最小,發(fā)生鎖沖突的概率最低,并發(fā)度也最高。

3) 頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現(xiàn)死鎖;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般。

三種鎖各有各的特點,若僅從鎖的角度來說,表級鎖更適合于以查詢?yōu)橹鳎挥猩倭堪此饕龡l件更新數(shù)據(jù)的應(yīng)用,如WEB應(yīng)用;行級鎖更適合于有大量按索引條件并發(fā)更新少量不同數(shù)據(jù),同時又有并發(fā)查詢的應(yīng)用,如一些在線事務(wù)處理(OLTP)系統(tǒng)。

MySQL表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨占寫鎖(Table Write Lock)。什么意思呢,就是說對MyISAM表進(jìn)行讀操作時,它不會阻塞其他用戶對同一表的讀請求,但會阻塞 對同一表的寫操作;而對MyISAM表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作。

MyISAM表的讀和寫是串行的,即在進(jìn)行讀操作時不能進(jìn)行寫操作,反之也是一樣。但在一定條件下MyISAM表也支持查詢和插入的操作的并發(fā)進(jìn)行,其機制是通過控制一個系統(tǒng)變量(concurrent_insert)來進(jìn)行的,當(dāng)其值設(shè)置為0時,不允許并發(fā)插入;當(dāng)其值設(shè)置為1 時,如果MyISAM表中沒有空洞(即表中沒有被刪除的行),MyISAM允許在一個進(jìn)程讀表的同時,另一個進(jìn)程從表尾插入記錄;當(dāng)其值設(shè)置為2時,無論MyISAM表中有沒有空洞,都允許在表尾并發(fā)插入記錄。

MyISAM鎖調(diào)度是如何實現(xiàn)的呢,這也是一個很關(guān)鍵的問題。例如,當(dāng)一個進(jìn)程請求某個MyISAM表的讀鎖,同時另一個進(jìn)程也請求同一表的寫鎖,此時MySQL將會如優(yōu)先處理進(jìn)程呢?通過研究表明,寫進(jìn)程將先獲得鎖(即使讀請求先到鎖等待隊列)。但這也造成一個很大的缺陷,即大量的寫操作會造成查詢操作很難獲得讀鎖,從而可能造成永遠(yuǎn)阻塞。所幸我們可以通過一些設(shè)置來調(diào)節(jié)MyISAM的調(diào)度行為。我們可通過指定參數(shù)low-priority-updates,使MyISAM默認(rèn)引擎給予讀請求以優(yōu)先的權(quán)利,設(shè)置其值為1(set low_priority_updates=1),使優(yōu)先級降低。

InnoDB鎖與MyISAM鎖的最大不同在于:一是支持事務(wù)(TRANCSACTION),二是采用了行級鎖。我們知道事務(wù)是由一組SQL語句組成的邏輯處理單元,其有四個屬性(簡稱ACID屬性),分別為:

原子性(Atomicity):事務(wù)是一個原子操作單元,其對數(shù)據(jù)的修改,要么全部執(zhí)行,要么全都不執(zhí)行;

一致性(Consistent):在事務(wù)開始和完成時,數(shù)據(jù)都必須保持一致狀態(tài);

隔離性(Isolation):數(shù)據(jù)庫系統(tǒng)提供一定的隔離機制,保證事務(wù)在不受外部并發(fā)操作影響的“獨立”環(huán)境執(zhí)行;

持久性(Durable):事務(wù)完成之后,它對于數(shù)據(jù)的修改是永久性的,即使出現(xiàn)系統(tǒng)故障也能夠保持。

InnoDB有兩種模式的行鎖:

1)共享鎖:允許一個事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖。

( Select * from table_name where ......lock in share mode)

2)排他鎖:允許獲得排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同數(shù)據(jù)集的共享讀鎖和 排他寫鎖。(select * from table_name where.....for update)

為了允許行鎖和表鎖共存,實現(xiàn)多粒度鎖機制;同時還有兩種內(nèi)部使用的意向鎖(都是表鎖),分別為意向共享鎖和意向排他鎖。

InnoDB行鎖是通過給索引項加鎖來實現(xiàn)的,即只有通過索引條件檢索數(shù)據(jù),InnoDB才使用行級鎖,否則將使用表鎖!

另外:插入,更新性能優(yōu)化的幾個重要參數(shù)

代碼如下:

bulk_insert_buffer_size

批量插入緩存大小, 這個參數(shù)是針對MyISAM存儲引擎來說的.適用于在一次性插入100-1000+條記錄時, 提高效率.默認(rèn)值是8M.可以針對數(shù)據(jù)量的大小,翻倍增加.

concurrent_insert

并發(fā)插入, 當(dāng)表沒有空洞(刪除過記錄), 在某進(jìn)程獲取讀鎖的情況下,其他進(jìn)程可以在表尾部進(jìn)行插入.

值可以設(shè)0不允許并發(fā)插入, 1當(dāng)表沒有空洞時, 執(zhí)行并發(fā)插入, 2不管是否有空洞都執(zhí)行并發(fā)插入.

默認(rèn)是1 針對表的刪除頻率來設(shè)置.

delay_key_write

針對MyISAM存儲引擎,延遲更新索引.意思是說,update記錄時,先將數(shù)據(jù)up到磁盤,但不up索引,將索引存在內(nèi)存里,當(dāng)表關(guān)閉時,將內(nèi)存索引,寫到磁盤. 值為 0不開啟, 1開啟. 默認(rèn)開啟.

delayed_insert_limit, delayed_insert_timeout, delayed_queue_size

延遲插入, 將數(shù)據(jù)先交給內(nèi)存隊列, 然后慢慢地插入.但是這些配置,不是所有的存儲引擎都支持, 目前來看, 常用的InnoDB不支持, MyISAM支持. 根據(jù)實際情況調(diào)大, 一般默認(rèn)夠用了

/* ==================== MySQL InnoDB 鎖表與鎖行 ======================== */

由于InnoDB預(yù)設(shè)是Row-Level Lock,所以只有「明確」的指定主鍵,MySQL才會執(zhí)行Row lock (只鎖住被選取的資料例) ,否則MySQL將會執(zhí)行Table Lock (將整個資料表單給鎖住)。

舉個例子: 假設(shè)有個表單products ,里面有id跟name二個欄位,id是主鍵。

例1: (明確指定主鍵,并且有此筆資料,row lock)

代碼如下:

SELECT * FROM products WHERE id='3' FOR UPDATE;

SELECT * FROM products WHERE id='3' and type=1 FOR UPDATE;

例2: (明確指定主鍵,若查無此筆資料,無lock)

代碼如下:

SELECT * FROM products WHERE id='-1' FOR UPDATE;

例3: (無主鍵,table lock)

代碼如下:

SELECT * FROM products WHERE name='Mouse' FOR UPDATE;

例4: (主鍵不明確,table lock)

代碼如下:

SELECT * FROM products WHERE id<>'3' FOR UPDATE;

例5: (主鍵不明確,table lock)

代碼如下:

SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;

注1: FOR UPDATE僅適用于InnoDB,且必須在交易區(qū)塊(BEGIN/COMMIT)中才能生效。

注2: 要測試鎖定的狀況,可以利用MySQL的Command Mode ,開二個視窗來做測試。

在MySql 5.0中測試確實是這樣的

另外:MyAsim 只支持表級鎖,InnerDB支持行級鎖

添加了(行級鎖/表級鎖)鎖的數(shù)據(jù)不能被其它事務(wù)再鎖定,也不被其它事務(wù)修改(修改、刪除)

是表級鎖時,不管是否查詢到記錄,都會鎖定表

此外,如果A與B都對表id進(jìn)行查詢但查詢不到記錄,則A與B在查詢上不會進(jìn)行row鎖,但A與B都會獲取排它鎖,此時A再插入一條記錄的話則會因為B已經(jīng)有鎖而處于等待中,此時B再插入一條同樣的數(shù)據(jù)則會拋出Deadlock found when trying to get lock; try restarting transaction然后釋放鎖,此時A就獲得了鎖而插入成功

innodb相關(guān)推薦
  • 相關(guān)百科
  • 相關(guān)知識
  • 相關(guān)專欄

最新詞條

安徽省政采項目管理咨詢有限公司 數(shù)字景楓科技發(fā)展(南京)有限公司 懷化市人民政府電子政務(wù)管理辦公室 河北省高速公路京德臨時籌建處 中石化華東石油工程有限公司工程技術(shù)分公司 手持無線POS機 廣東合正采購招標(biāo)有限公司 上海城建信息科技有限公司 甘肅鑫禾國際招標(biāo)有限公司 燒結(jié)金屬材料 齒輪計量泵 廣州采陽招標(biāo)代理有限公司河源分公司 高鋁碳化硅磚 博洛尼智能科技(青島)有限公司 燒結(jié)剛玉磚 深圳市東海國際招標(biāo)有限公司 搭建香蕉育苗大棚 SF計量單位 福建省中億通招標(biāo)咨詢有限公司 泛海三江 威海鼠尾草 Excel 數(shù)據(jù)處理與分析應(yīng)用大全 廣東國咨招標(biāo)有限公司 拆邊機 甘肅中泰博瑞工程項目管理咨詢有限公司 山東創(chuàng)盈項目管理有限公司 當(dāng)代建筑大師 廣西北纜電纜有限公司 大山檳榔 上海地鐵維護(hù)保障有限公司通號分公司 舌花雛菊 甘肅中維國際招標(biāo)有限公司 華潤燃?xì)猓ㄉ虾#┯邢薰? 湖北鑫宇陽光工程咨詢有限公司 GB8163標(biāo)準(zhǔn)無縫鋼管 中國石油煉化工程建設(shè)項目部 韶關(guān)市優(yōu)采招標(biāo)代理有限公司 莎草目 電梯平層準(zhǔn)確度 建設(shè)部關(guān)于開展城市規(guī)劃動態(tài)監(jiān)測工作的通知 廣州利好來電氣有限公司 四川中澤盛世招標(biāo)代理有限公司