mysql一些知识点整理

mysql数据库事务之间的隔离级别

  • READ UNCOMMITTED-事务可以查看其它未提交事务的执行结果,很少用于生产环境,性能也不比其它隔离级别高多少。读取未提交的结果称为“脏读”
  • READ COMMITTED-事务可以查看其它已提交事务的执行结果,大多数数据库(除了mysql)都是采用这个默认隔离级别。不可重复读(用户重复查询两次之间别的事务可能已提交导致查询结果不一致)
  • REPEATABLE-可重复读,同一个事务的不同实例并发读取会得到同样的结果,但是存在幻读的情况。mysql用MVCC机制消除这种情况
  • SERIALIZABLE-最高隔离级别,强制事务排序,性能低下,存在大量超时情况和锁。

MVCC多版本并发控制

工作原理是保留数据在某个时间点的快照,不同的存储引擎实现方式不一样。innodb对每行数据存储额外的两个隐藏字段记录数据行创建时间以及删除时间。(MVCC仅仅对READ COMMITED和REPEATABLE两种隔离级别有效)下面看看repeatable的实现

  • SELECT-行的版本号必须早于或等于事务版本号(事务开始前已创建或由事务创建);数据航删除版本号必须是undefined或者大于事务版本号
  • INSERT-innodb指定插入行的版本号为系统当前版本号
  • DELETE-指定行的删除版本号为当前系统版本号
  • UPDATE-创建一个新的数据航拷贝,使用当前版本号作为新数据行的创建标识和旧数据行的删除标识

数据类型选型原则

  • 越小越好-尽量使用能存储数据的最小的数据类型,由于使用更小的磁盘空间,占用更少的内存和cpu缓存,花费更少的cpu周期处理
  • 保持简单-使用整型数据而不是字符串做比较,使用内置日期时间类型存储而不要用字符串存储时间,使用整型存储ip地址等
  • 尽量避免NULL值-将列定义为not null,mysql不能对null的列做优化,而且null的列使用更多存储空间需要mysql内部特殊处理,当允许null值的字段做索引时,会引入额外花销。如果实在需要使用null,则可以考虑用0或者一个特殊值或者一个空字符串代替。(使用not null带来的性能提升不是很明显,所以数据表已经设计好后就不要专门为这个做修改了)
  • ...

数据库基准测试(benchmark)

 有两种基本的测试策略:测试整个系统(应用程序)和单独测试数据库mysql

测试整个系统能关注整个系统运行状况,mysql常常不是一个系统的瓶颈(工具有ab,http_load等)。当然如果你想测试某个存储引擎或者设计模式的性能,就需要单独测试数据库,测试的时候需要设计自己关注的目标点——比如每个时间单位执行事务数目,响应时间延时,可扩展性,不同负载下数据库的表现,并发度,对磁盘IO负载高低等,工具有mysqlslap等

 

MyISAM存储引擎

有不错的性能表现和丰富的特性如下:

锁机制(表级锁而非行级,读获取共享锁,写获取排他锁,通过concurrent inserts实现并发控制)

自动修复表错误

手动修复CHECK TABLE mytable或REPAIR TABLE mytable或者使用myisamchk工具

支持全文索引

延迟写入Delayed key writes

各种引擎比较


 

猜你喜欢

转载自ciaos.iteye.com/blog/1777043