文章列表
 
您正在查看 "Database" 分类下的文章

2009-04-12 21:18
    MVCC提供了数据库并发访问功能。数据库利用MVCC保证每个数据库Connection都拥有一份独立的快照(Snapshot),并利用这份快照进行CRUD。一个Connection操作(CRUD)的结果,只要该Connection的事务不提交,这些结果其他Connection是看不到的。
锁的粒度

   提高并发性的手段之一就是细化锁的力度,也就是只对你想要修改的数据加锁。只要修改彼此不冲突,通过减少被锁住的数据,就能尽可能的多修改数据。Mysql的不同的存储引擎使用的锁力度也不同,MYISAM使用了表(Table) 锁,而Innodb跟Oracle一样使用的是行锁。但基于锁的并发控制要求应用程序进行获得锁、检查锁是否可用,释放锁等操作,这些操作都会影响应用程序的性能。
   使用MVCC多版本并发控制比锁定模型的主要优点是在MVCC里, 对检索(读)数据的锁要求与写数据的锁要求不冲突, 所以读不会阻塞写,而写也从不阻塞读。恰当地使用 MVCC 总会比锁有更好地性能。
   在一个MVCC系统中,每一行有包含了2个额外的字段——创建版本号和删除版本号。这2个字段表示这一行数据室什么时候创建的以及什么时候过期(也就是删除)。当发生了某个事件,数据库就会生成一个版本号并保存起来。版本号是一个数字,每次查询数据库的时候就递增。数据库负责记录运行的查询以及相关联的版本号。接下来我们看看MVCC系统是怎么工作地。

SELECT语句
当需要从表中检索数据的时候,服务器要确保只有满足以下条件的记录才能做为查询结果返回:
  • 记录行的创建ID必须小于等于系统版本号。这样才能保证这行数据是在当前查询开始前就已经生成了的。

  • 如果记录行的删除ID不为空,那么删除ID就要大于当前系统的版本号。 这样才能确保这行数据在查询开始以前未被删除。

  • 行记录的创建ID不再运行中的查询列表中。这样保证这行数据不是由正在运行的查询生成或修改得到的。

INSERT语句
当需要在某这表加入一行数据的时候,数据库就把当前系统的版本号作为该行数据的创建ID和这行数据一并加入到表中。
DELETE语句

删除某行记录的时候,数据库就把系统的当前版本号做为该行数据的删除ID。

UPDATE 语句

当某行数据需要修改的时候,数据库就创建该行数据的拷贝并用系统当前版本号做为新纪录的创建ID。 同时用这个版本号做为老数据的删除ID。

用以上的实现方式保证了读操作是永远不会锁住表、页和记录行。

总结

   以上内容是MVCC这块学习内容的整理,由于没有read过实际MVCC的数据库的代码,感觉还是有很多不明确的地方,纸上得来终觉浅呀!

参考资料
MVCC介绍
Multiversion concurrency control
High Performance MySQL第一版 第2.2 节

 
2009-03-19 20:11
很多次被问起 内连接、左连接 、 右连接相关的问题。每次的回答都不是很明确,前端时间看到一篇文章用绘图的方式给出了明确的回答。原文的链接为http://www.codinghorror.com/blog/archives/000976.html
内连接 Inner join
SELECT * FROM TableA
INNER JOIN TableB
ON TableA.name = TableB.name

全外连接 Full outer join
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
左外连接 Left outer join
SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name

表A中排除了B中的记录

SELECT * FROM TableA
LEFT OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableB.id IS null

A表和B表中互不相等
SELECT * FROM TableA
FULL OUTER JOIN TableB
ON TableA.name = TableB.name
WHERE TableA.id IS null
OR TableB.id IS null

 
2008-11-01 7:06

    前几周关于索引为team members做了一次简单的介绍。我不是数据库方面的专家,介绍的目的是帮大家建立起最基本的关于索引的概念和一些简单的使用技巧。百度的Bog不支持复杂的HTML编辑,只能把PPT的内容做为TXT贴上来,并提供google share doc的访问路径。

Concept
HASH vs B+ Tree
Cluster Index vs No Cluster Index
INNODB vs MYISAM

Improving Insert performance
Batch INSERT and REPLACE
Use LOAD DATA instead of INSERT
Forbidden Foreign key
Forbidden Index
Rebuild Index

FAQ
Do you always need index on WHERE column
Does the order of columns in an index matter
IN vs OR
large IN clauses are problematic

Tools
Explain

Tricks
Make sure you strike a good balance for indexing
Too many adversely affects data input
Too few adversely affects reads
Order of columns in an index matters!
Covering indexes are the fastest query possible
Consider the impact of duplicate rows
Avoid SELECT DISTINCT if it doesn’t cause a problem
Use UNION ALL instead of UNION if duplicate rows are acceptable
Use foreign key as index or create independent index
Despite what you see in examples, avoid SELECT *
Operators in the WHERE clause make a big difference
Avoid <> and LIKE
Use EXISTS, NOT EXISTS, and LEFT JOINS instead of NOT IN
If you must use LIKE, make the first character a literal
Don’t use ORDER BY unless you really need it
Don’t use Count(…) where to protect data integeration
Don't use ORDER BY RAND() when data is huge

Resource
http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#insert-speed
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
http://www.informit.com/articles/article.aspx?p=377652


Google Share Doc Link
docs.google.com/Presentation

相关资料

转载:83个Mysql性能技巧(Top-83-mysql-performance-tips )

 
 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

如果我想学习了解单元测试的话,我想知道我学到什么水平、或者说了哪些内容后才可以
 

按照这种操作,创建分支,点击ok后,提示access to 'http://xxxx/svn' forbidden,这
 

今天刚了解了这个设计原则,摊开来讲的话,博大精深
 

能详细阐述一下就好了
 

thx
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu