MySQL 歸納總結

1.MySQL存儲引擎

主要使用的就是兩個存儲引擎,分別是InnoDB和MyISAM。

InnoDB

InnoDB是MySQL的默認存儲引擎。
InnoDB採用MVCC來支援高並發,並且實現了四個標準的隔離級別。默認的隔離級別是可重複讀。通過間隙鎖策略防止幻讀的出現。
InnoDB表是基於聚簇索引建立的。聚簇索引對主鍵查詢有很高的性能。
InnoDB內部做了很多優化。包括從磁碟讀取數據時採用可預測性預讀,能夠自動在記憶體中創建Hash索引以加速讀操作的自適應哈希索引,以及能夠加速插入操作的插入緩衝區等。

MyISAM

MyISAM提供了大量的特性,包括全文索引、壓縮、空間函數等,但MyISAM不支援事務和行級鎖。
在MyISAM表,可以基於其前500個字元創建索引。MyISAM也支援全文索引,這是一種基於分詞創建但索引,支援複雜但查詢。
MyISAM引擎設計簡單,數據以緊密格式存儲,在某些場景下,性能很好。

InnoDB和MyISAM區別

  1. 是否支援事務
  • InnoDB支援事務
    對於InnoDB每一條SQL語言都默認封裝成事務,自動提交,這樣會影響速度,所以最好把多條SQL語言放在begin transaction和commit之間,組成一個事務;
  • MyISAM不支援,
  1. 支援鎖的級別不同
  • InnoDB支援行鎖
    注意:資料庫的主鍵和索引對鎖是有影響的。
    在使用for update的時候,在明確使用主鍵或者索引的時候才會是行鎖,否則就是表鎖。
  • MyISAM只支援表鎖
  1. 是否支援外鍵
  • InnoDB支援外鍵
  • MyISAM不支援。
  • 4. 存放索引的方式

    • InnoDB是聚集索引,
      數據文件是和索引綁在一起的,必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到數據。
      因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。
    • MyISAM是非聚集索引,數據文件是分離的,
      索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。
    1. 查詢具體行數的差異
    • InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。
    • MyISAM用一個變數保存了整個表的行數,執行上述語句時只需要讀出該變數即可,速度很快;
    1. 是否支援全文索引
    • Innodb不支援全文索引(innodb引擎在5.6.4版本提供了對全文索引的支援)
    • MyISAM支援全文索引,查詢效率上MyISAM要高於Innodb;
Tags: