mysql是我們常用的資料庫,它有兩種不同的儲存引擎,弄清楚兩者之間的區別,才能夠在選擇時做到心中有數。我們先看結論:
innodb
myisam
支援事務、外來鍵
不支援事、外來鍵
聚簇索引
非聚簇索引
不支援全文索引(5.6.4之後也支援了)
支援全文索引
支援到行鎖
支援表鎖
不儲存表資料總條數
儲存表資料總條數
讀寫阻塞與實務相關
讀會阻塞寫
在mysql 5.1之前的版本中,預設的搜尋引擎是myisam,從mysql 5.5之後的版本中,預設的搜尋引擎變更為innodb。
因此在進行選擇時可以有相應的取捨:
myisam
盡量索引(快取機制)
調整讀寫優先順序,根據實際需求確保重要操作更優先
啟用延遲插入改善大批量寫入效能
盡量順序操作讓insert資料都寫入到尾部,減少阻塞
分解大的操作,降低單個操作的阻塞時間
降低併發數,某些高併發場景通過應用來進行排隊機制
對於相對靜態的資料,充分利用query cache可以極大的提高訪問效率
myisam的count只有在全表掃瞄的時候特別高效,帶有其他條件的count都需要進行實際的資料訪問
innodb
主鍵盡可能小,避免給secondary index帶來過大的空間負擔
避免全表掃瞄,因為會使用表鎖
盡可能快取所有的索引和資料,提高響應速度
在大批量小插入的時候,盡量自己控制事務而不要使用autocommit自動提交
合理設定innodb_flush_log_at_trx_commit引數值,不要過度追求安全性
避免主鍵更新,因為這會帶來大量的資料移動
參考:
MySQL儲存引擎 InnoDB
為什麼innodb不將總數存起來?innodb直接count 會遍歷全表 沒有where條件 雖然結果準確,但會導致效能問題。按照效率排序的話,count 字段 innodb一棵b 樹可以存放多少行資料?這個問題的簡單回答是 約2千萬。為什麼是這麼多呢?因為這是可以算出來的,要搞清楚這個問題,我們先...
MYISAM引擎和INNODB引擎的區別
一 功能性的比較 1.innodb支援事務,支援外來鍵約束,是乙個事務性的儲存引擎 表級鎖定的主要是myisam,memory,csv等一些非事務性儲存引擎 二 鎖的比較 1 innodb主要應用於行級鎖 row level 2 myisam主要應用於表級鎖 table level 三 各個鎖的比較...
MySQL的儲存引擎INNODB
1 一般情況下,mysql會預設提供多種儲存引擎,你可以通過下面的檢視 看你的mysql現在已提供什麼儲存引擎 mysql show engines 看你的mysql當前預設的儲存引擎 mysql show variables like storage engine 你要看某個錶用了什麼引擎 在顯示...