團隊裏有位成員接了個需求:按天統計出操做日誌。因爲系統運行有一段時間了,目前涉及的 MySQL 數據庫表數據量已達到上億,他擔憂寫好代碼後執行 SQL 速度過慢影響性能。咱們看了下這個表用的存儲引擎是 InnoDB,對於這種查詢比較多的需求,若是用 MyISAM 引擎是否就好呢?html
衆所周知,MySQL 有兩種常見的存儲引擎。一種是 MyISAM,一種是 InnoDB。mysql
我發現不少人在交流技術的時候,對英文技術名詞的讀法千奇百怪,甚至藉助肢體語言、豐富的表情,試圖表意,雙方纔能頻頻點頭(潛臺詞:搞了半天原來你說的是這個東西啊~),因此要養成一種習慣:對於還有些模糊的技術名詞,都要引起本身的興趣去考究一番。sql
那,貼一下這兩個存儲引擎的單詞發音吧,試着讀幾遍你就記住了。數據庫
技術名詞 | 發音 |
---|---|
MyISAM | [maɪ-zeim] |
InnoDB | [,ɪnnə-db] |
接下來咱們嘗試回答幾個問題。less
1、它們是什麼?性能
先來看看官網對 MyISAM 的描述,只有一句話,看來官方也不想多加解釋。ui
MyISAM is based on the older (and no longer available) ISAM storage engine but has many useful extensions.翻譯
大意:MyISAM 是一款青出於藍而勝於藍的存儲引擎,它在 ISAM 基礎上做了一些擴展和加工。關於 ISAM ,我只告訴你它是 Indexed Sequential Access Method 的縮寫,翻譯爲「有索引的順序訪問方法」。設計
而對 InnoDB 的描述,就更 professional 一些了。3d
InnoDB is a general-purpose storage engine that balances high reliability and high performance. In MySQL 8.0, InnoDB is the default MySQL storage engine. Unless you have configured a different default storage engine, issuing a CREATE TABLE statement without an ENGINE= clause creates an InnoDB table.
大意:InnoDB 是一種通用的存儲引擎,在高可靠和高性能上做了均衡。MySQL 8.0 中,它是默認的存儲引擎(其實在5.5以後的版本就是了),當你執行 CREATE TABLE 建表語句而且不帶 「ENGINE = 」子句時,默認幫你建立的就是 InnoDB 表了。
2、二者有什麼區別?
每一個引擎都有利有弊。
先仍是拿官網二者的 Features 來做一個分析對比吧:
一、InnoDB 是彙集索引,數據文件是和索引綁在一塊兒的,必需要有主鍵,經過主鍵索引效率很高,可是輔助索引須要兩次查詢,先查詢到主鍵,而後再經過主鍵查詢到數據。所以,主鍵不該該過大,不然其餘索引也會很大。而 MyISAM 是非彙集索引,數據文件是分離的,索引保存的是數據文件的指針,主鍵索引和輔助索引是獨立的。
二、InnoDB 支持外鍵,而 MyISAM 不支持。對一個包含外鍵的 InnoDB 錶轉爲 MYISAM 會失敗。
三、InnoDB 在 MySQL 5.6 以前不支持全文索引,而 MyISAM 一直都支持,若是你用的是老版本,查詢效率上 MyISAM 要高。
四、InnoDB 鎖粒度是行鎖,而 MyISAM 是表鎖。
五、InnoDB 支持事務,MyISAM 不支持,對於 InnoDB 每一條 SQL 語言都默認封裝成事務,自動提交,這樣會影響速度,因此最好把多條 SQL 語言放在 begin 和 commit 之間,組成一個事務。
六、InnoDB 不保存表的具體行數,執行 select count(*) from table 時須要全表掃描。而 MyISAM 用一個變量保存了整個表的行數,執行上述語句時只須要讀出該變量便可,速度很快,但若是上述語句還包含了 where 子句,那麼二者執行效率是同樣的。
3、說了這麼多,我到底該選哪一個?
兩種存儲引擎的選擇,要結合你的業務場景來作選型,能夠參考如下基本原則:
一、是否要支持事務,若是要請選擇 Innodb,若是不須要能夠考慮 MyISAM。
二、若是表中絕大多數都是讀查詢(有人總結出 讀:寫比率大於100:1),能夠考慮 MyISAM,若是既有讀又有寫,並且也挺頻繁,請使用 InnoDB。
三、系統崩潰後,MyISAM 恢復起來更困難,可否接受。
四、MySQL 5.5 開始 InnoDB 已經成爲 MySQL 的默認引擎(以前是 MyISAM ),說明其優點是有目共睹的,若是你不知道用什麼,那就用InnoDB吧,至少不會差。
那咱們試圖來回答剛開始提到的問題:是否當初設計表結構的時候就要用 MyISAM 呢?不見得,試想一下,既然是一張用來記錄操做人員的行爲表,那確定涉及到大量的寫操做,多人使用還涉及批量操做,邏輯複雜一點還要用到事務控制。後面的需求雖然全是讀需求,但若是索引設計合理,SQL 語句寫得夠好,性能同樣沒什麼問題。