限于自己的水平還未達到DBA級別,只能先以應(yīng)用為主的角度讀了。
也許過幾個月再回來重讀,會有另一番心得。
索引
約束和索引的區(qū)別
約束更是一個邏輯的概念,用來保證數(shù)據(jù)的完整性。而索引是一個數(shù)據(jù)結(jié)構(gòu),有邏輯上的概念,更是一個物理存儲的方式。
默認(rèn)情況下,MySQL允許非法或者不正確數(shù)據(jù)的插入或更新,或者內(nèi)部將其轉(zhuǎn)化為一個合法的值。如對NOT NULL的字段插入NULL,會將其更改為0再進行插入。
比如用Insert XXX SELECT語句就可以插入,但用Insert XXX values XXX則不行。
可以通過修改sql_mode參數(shù)來約束輸入值合法性。
在MySQL InnoDB中,建立外鍵會自動給其加上索引。而在Oracle則不會,要注意手動添加索引。
B+索引適合取得的數(shù)據(jù)量少時使用。
Hash索引只能用來搜索等值的查詢,而對于其他查找類型如范圍查找則不能使用。
事務(wù)與鎖
InnoDB的默認(rèn)事務(wù)隔離級別為Repeatable Read。(Oracle是Read Committed)
對于自增列的并發(fā)插入較差。(5.1.22版后有所改善)
默認(rèn)情況下InnoDB不會回滾超時引發(fā)的異常。(用JDBC則能避免此問題)
發(fā)生死鎖后,InnoDB會馬上回滾該事務(wù)(錯誤號1213),而應(yīng)用程序則不用再回滾了。
Sql Server有鎖升級機制,MySQL和Oracle無。
ROLLBACK TO SAVEPOINT并不會結(jié)束事務(wù),仍然需要調(diào)用COMMIT或ROLLBACK。
TRUNCATE TABLE和DELETE的區(qū)別在于前者不能被回滾。
SERIALIABLE的事務(wù)隔離級別主要應(yīng)用于InnoDB的分布式事務(wù)。
使用InnoDB不忌諱相對長時間開啟事務(wù),不會發(fā)生Oracle的Snapshot Too Old。
自動回滾會隱藏錯誤,盡量少用或不用。
對事務(wù)的操作,應(yīng)該交由應(yīng)用程序控制,而不是存儲過程。
備份
熱備的事務(wù)隔離級別應(yīng)是Repeatable Read,從而實現(xiàn)數(shù)據(jù)一致性。
mysqldump參數(shù)
--single-transaction 只對InnoDB有效
--lock-tables db又有MyISAM又有InnoDB時使用
--hex-blob 能把blob等數(shù)據(jù)備份出來
mysqldump不能導(dǎo)出視圖,需要另外導(dǎo)出,比如使用frm文件
其他
MyISAM特點是表鎖、支持全文索引、不支持事務(wù)、【外鍵】。
Archive只支持INSERT和SELECT操作,非常適合存儲歸檔數(shù)據(jù)。
查看錯誤日志
show variables like 'log_error';
OLAP是CPU密集型的操作,而OLTP是IO密集型的操作。
Windows下表名不區(qū)分大小寫,而Linux默認(rèn)大小寫敏感。
http://atealxt.appspot.com/article/20110228/mysql_study_note_9787111321880_B004F9PL2O.html