MyISAM與InnoDB兩者之間怎麼選擇

來源:互聯網
上載者:User

1、MyISAM不支援事務,InnoDB是事務類型的儲存引擎
 
當我們的表需要用到事務支援的時候,那肯定是不能選擇MyISAM了。

2、MyISAM只支援表級鎖,BDB支援頁級鎖和表級鎖預設為頁級鎖,而InnoDB支援行級鎖和表級鎖預設為行級鎖
 
表級鎖:直接鎖定整張表,在鎖定期間,其他進程無法對該表進行寫操作,如果設定的是寫鎖,那麼其他進程讀也不允許
 
MyISAM是表級鎖定的儲存引擎,它不會出現死結問題
 
對於write,表鎖定原理如下:
 
如果表上沒有鎖,在其上面放置一個寫鎖,否則,把鎖定請求放在寫鎖隊列中。
 
對於read,表鎖定原理如下 :
 
如果表上沒有寫鎖定,那麼把一個讀鎖放在其上面,否則把鎖請求放在讀鎖定隊列中
 
當一個鎖定被釋放時,表可被寫鎖定隊列中的線程得到,然後才是讀鎖定隊列中的線程。這意味著,如果你在一個表上有許多更新,那麼你的SELECT語句將等到所有的寫鎖定線程執行完。

行級鎖:只對指定的行進行鎖定,其他進程還是可以對錶中的其他行進行操作的。
 
行級鎖是Mysql粒度最小的一種鎖,它能大大的減少資料庫操作的衝突,但是粒度越小實現成本也越大。
 
行級鎖可能會導致“死結”,那到底是怎麼導致的呢,分析原因:Mysql行級鎖並不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql語句操作了主鍵索引,那麼Mysql就會鎖定這個主鍵索引,如果sql語句操作的是非主鍵索引,那麼Mysql會先鎖定這個非主鍵索引,再去鎖定主鍵索引。
 
在UPDATE 和 DELETE操作時Mysql不僅會鎖定所有WHERE 條件掃描過得索引,還會鎖定相鄰的索引值。
 
“死結”舉例分析:
 
表Test:(ID,STATE,TIME)  主鍵索引:ID  非主鍵索引:STATE
 
當執行"UPDATE  STATE =1011 WHERE STATE=1000"  語句的時候會鎖定STATE索引,由於STATE 是非主鍵索引,所以Mysql還會去請求鎖定ID索引
 
當另一個SQL語句與語句1幾乎同時執行時:“UPDATE STATE=1010 WHERE ID=1”  對於語句2 Mysql會先鎖定ID索引,由於語句2操作了STATE欄位,所以Mysql還會請求鎖定STATE索引。這時。彼此鎖定著對方需要的索引,又都在等待對方釋放鎖定。所以出現了"死結"的情況。
 
行級鎖的優點:
 
有許多線程訪問不同的行時,只存在少量的衝突。
 
復原時只有少量的更改
 
可以長時間鎖定單一的行
 
行級鎖缺點:
 
相對於頁級鎖和表級鎖來說佔用了更多的記憶體
 
當表的大部分行在使用時,比頁級鎖和表級鎖慢,因為你必須獲得更多的鎖
 
當在大部分資料上經常使用GROUP BY操作,肯定會比表級鎖和頁級鎖慢。
 
頁級鎖:表級鎖速度快,但是衝突多;行級鎖速度慢,但衝突少;頁級鎖就是他倆折中的,一次鎖定相鄰的一組記錄。

3、MyISAM引擎不支援外鍵,InnoDB支援外鍵

4、MyISAM引擎的表在大量高並發的讀寫下會經常出現表損壞的情況
 
我們正在做的項目就遇到這個問題,表的INSERT 和 UPDATE操作很頻繁,原來用的MyISAM引擎,導致表隔三差五就損壞,後來更換成了InnoDB引擎。
 
其他容易導致表損壞原因:
 
伺服器突然斷電導致資料檔案損壞,強制關機(mysqld未關閉情況下)導致表損壞
 
mysqld進程在寫入操作的時候被殺掉
 
磁碟故障
 
表損壞常見癥狀:
 
查詢表不能返回資料或返回部分資料
 
開啟表失敗: Can’t open file: ‘×××.MYI’ (errno: 145) 。
 
Error: Table 'p' is marked as crashed and should be repaired 。

Incorrect key file for table: '...'. Try to repair it
 
Mysql表的恢複:

對於MyISAM表的恢複:

可以使用Mysql內建的myisamchk工具: myisamchk -r tablename  或者 myisamchk -o tablename(比前面的更保險) 對錶進行修複

5、對於count()查詢來說MyISAM更有優勢

因為MyISAM儲存了表中的行數記錄,執行SELECT COUNT() 的時候可以直接擷取到結果,而InnoDB需要掃描全部資料後得到結果。

但是注意一點:對於帶有WHERE 條件的 SELECT COUNT()語句兩種引擎的表執行過程是一樣的,都需要掃描全部資料後得到結果

6、 InnoDB是為處理巨大資料量時的最大效能設計,它的CPU效率可能是任何其它基於磁碟的關聯式資料庫引擎所不能匹敵的。

7、MyISAM支援全文索引(FULLTEXT),InnoDB不支援

8、MyISAM引擎的表的查詢、更新、插入的效率要比InnoDB高

我沒有做過詳細的測試,就在網上截取了前輩們測試結論: 

所有的效能測試在:Micrisoft window xp sp2 , Intel(R) Pentinum(R) M processor 1.6oGHz 1G 記憶體的電腦上測試。
 
測試方法:連續提交10個query, 表記錄總數:38萬 , 時間單位 s
 
        引擎類型                    MyISAM                InnoDB              效能相差
 
        count                      0.0008357            3.0163                3609
 
        查詢主鍵                  0.005708              0.1574                27.57
 
        查詢非主鍵                  24.01                  80.37                3.348
 
        更新主鍵                  0.008124            0.8183                100.7
 
        更新非主鍵                0.004141            0.02625              6.338
 
        插入                        0.004188            0.3694                88.21
 

    (1)加了索引以後,對於MyISAM查詢可以加快:4 206.09733倍,對InnoDB查詢加快510.72921倍,同時對MyISAM更新速度減慢為原來的1/2,InnoDB的更
  新速度減慢為原來的1/30。要看情況決定是否要加索引,比如不查詢的log表,不要做任何的索引。
 
    (2)如果你的資料量是百萬層級的,並且沒有任何的交易處理,那麼用MyISAM是效能最好的選擇。
 
    (3)InnoDB表的大小更加的大,用MyISAM可省很多的硬碟空間。
 
        在我們測試的這個38w的表中,表佔用空間的情況如下:
            引擎類型                    MyISAM              InnoDB
            資料                      53,924 KB          58,976 KB
            索引                      13,640 KB          21,072 KB
            佔用總空間              67,564 KB          80,048 KB
 
        另外一個176W萬記錄的表, 表佔用空間的情況如下:
 
            引擎類型                MyIsam              InnorDB
            資料                  56,166 KB          90,736 KB
            索引                  67,103 KB          88,848 KB
            佔用總空間        123,269 KB        179,584 KB

推薦閱讀:

InnoDB儲存引擎的啟動、關閉與恢複

MySQL InnoDB獨立資料表空間的配置

MySQL Server 層和 InnoDB 引擎層 體繫結構圖

InnoDB 死結案例解析

MySQL Innodb獨立資料表空間的配置

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.