Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4160217
  • 博文数量: 240
  • 博客积分: 11504
  • 博客等级: 上将
  • 技术积分: 4277
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-28 14:24
文章分类

全部博文(240)

分类: Mysql/postgreSQL

2008-07-21 14:38:44

今天来简单总结一下MySQL的锁机制,不妥的欢迎拍砖!

 


1、对于MySQL来说,有三种锁的级别:页级、表级、行级。

页级的典型代表引擎为BDB。
表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。
行级的典型代表引擎为INNODB。

2、我们实际应用中用的最多的就是行锁了。

行级锁的优点如下:
1)、当很多连接分别进行不同的查询时减小LOCK状态。
2)、如果出现异常,可以减少数据的丢失。因为一次可以只回滚一行或者几行少量的数据。
行级锁的缺点如下:
1)、比页级锁和表级锁要占用更多的内存。
2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写操作而不是读操作。
3)、容易出现死锁

3、MySQL用写队列和读队列来实现对数据库的写和读操作。

对于写锁定如下
1)、如果表没有加锁,那么对其加写锁定。
2)、否则,那么把请求放入写锁队列中。

对于读锁定如下:
1)、如果表没有加写锁,那么加一个读锁。
2)、否则,那么把请求放到读锁队列中。

当然我们可以分别用low_priority 以及high_priority在写和读操作上来改变这些行为。


4、下面我来一个简单的例子解释上面的说法。



我们来运行一个时间很长的查询
1)、客户端1:
   mysql> select count(*) from content group by content;
   ...
 客户端2:
   mysql> update content set content = 'I love you' where id = 444;
   Query OK, 1 row affected (30.68 sec)
   Rows matched: 1  Changed: 1  Warnings: 0
   用了半分钟。
2)、我们现在终止客户端1。
 此时客户端2:
   mysql> update content set content = 'I hate you' where id = 444;
   Query OK, 1 row affected (0.02 sec)
   Rows matched: 1  Changed: 1  Warnings: 0
 仅仅用了20毫秒。

这个例子很好的说明了读写队列的运行。
对于1中的客户端1,此时表没有加锁,当然也没有加写锁了,那么此时客户端1对表加了一个读锁。
对于1中的客户端2,此时因为表有一个读锁,所以把UPDATE请求放到写锁定队列中。
当读锁释放的时候,也就是SHOW PROCESSLIST中STATUS 为COPY TO TMP TABLE的时候,UPDATE操作开始执行。


5、
可以在REPLICATION中对MASTER 和SLAVE运用不同的锁定使系统达到最佳的性能。(当然这个前提是SQL语句都是最优的。)

阅读(6308) | 评论(8) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-07-08 11:35:37

我也有小些心得 http://tanzj.blog.51cto.com/802764/174968 欢迎砸砖头

mysql_nerd2009-01-14 01:59:40

Number 4 is inclusive. I can argue that your second query hit the mysql query cache, which takes around 0.02 seconds. For the first query, if you did not index the id, it will force mysql to scan the whole table, then the execution time would depend on your table size. You should give the table type at least...

magicgod2008-09-22 21:02:31

应用锁主要有两个函数:GET_LOCK和RELEASE_LOCK,可以用在任何地方,实际上还可以充当一个集群锁。 应用锁有超时限制,一般来说不会死锁,超时之后会自动解锁,性能上很不错,因为实际上不涉及到数据。

chinaunix网友2008-09-22 20:58:41

似乎没有讲应用锁

chinaunix网友2008-08-04 23:18:54

看看这书: OReilly.High Performance MySQL.chm