限于自己的水平还未达到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