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