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: