1: mysql ?存儲引擎 主要包括 innodb ,myisam ,memory 等等
innodb 與 myisam 優(yōu)缺點對比:
innodb 支持事務處理(ACID), 支持行鎖,更強大的索引
myisam 在數(shù)據(jù)量大,查詢時效率高
1:存儲結構 ??
myisam 數(shù)據(jù)保存在三個文件中,第一個文件的名字以表的名字開始,擴展名指出文件類型。.frm文件存儲表定義。數(shù)據(jù)文件的擴展名為.MYD (MYData)。索引文件的擴展名是.MYI
innodb 數(shù)據(jù)都保存在一個文件中
2: 存儲空間
MyISAM:可被壓縮,存儲空間較小。支持三種不同的存儲格式:靜態(tài)表(默認,但是注意數(shù)據(jù)末尾不能有空格,會被去掉)、動態(tài)表、壓縮表。
InnoDB:需要更多的內(nèi)存和存儲,它會在主內(nèi)存中建立其專用的緩沖池用于高速緩沖數(shù)據(jù)和索引。
3、 事務支持
MyISAM:強調(diào)的是性能,每次查詢具有原子性,其執(zhí)行數(shù)度比InnoDB類型更快,但是不提供事務支持。
InnoDB:提供事務支持事務,外部鍵等高級數(shù)據(jù)庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。
4、 CURD操作
MyISAM:如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。(因為沒有支持行級鎖),在增刪的時候需要鎖定整個表格,效率會低一些。相關的是innodb支持行級鎖,刪除插入的時候只需要鎖定改行就行,效率較高
InnoDB:如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表。DELETE 從性能上InnoDB更優(yōu),但DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除,在innodb上如果要清空保存有大量數(shù)據(jù)的表,最好使用truncate table這個命令。
5、 外鍵(一個表的一列,作為另一表的主鍵)
MyISAM:不支持
InnoDB:支持
innodb 事務 有四種隔離級別:(聚簇索引 包括 主鍵b+tree 輔助鍵 b+tree)
臟讀:當一個事務update 一行數(shù)據(jù),沒有commit ,另一個事務會讀取到未提交的數(shù)
不可重復讀:一個事務在執(zhí)行過程中,查詢了兩次數(shù)據(jù),另外一個事務更新了該條數(shù)據(jù),導致這個事務兩次讀的數(shù)據(jù)不一致
幻讀:一個事務在執(zhí)行時,另一個事務向里面插入一條新的數(shù)據(jù),會出現(xiàn)新數(shù)據(jù)沒有執(zhí)行事務操作。
1:不可提交讀 會出現(xiàn)臟讀 , 不可重復讀 , 幻讀
2:可提交讀 ?會出現(xiàn)不可重復讀,幻讀
3:可重復讀 會出現(xiàn)幻讀
4:可串行讀 都不會出現(xiàn) , 但使用鎖會較多,占用內(nèi)存資源
鎖類別:
1:共享鎖 : 可讀 ?不可更新
2:排它鎖 :不可讀,不可更新