在理论上innodb引擎能实现行级锁。
在MYISAM中,假设我的一个表有1KW条数据。然后对某个帖子进行编辑,提交的这一瞬间,MYSQL全表写锁定,这时候发过来的其他任何请求都被阻塞,直到这个写锁定被释放。
而在innodb中,提交的时候只对这一行数据进行锁定。其他不冲突的请求也能同步进行。
INNODB的伪行锁特性
对oracle熟悉的人可能会误认为mysql的行锁也是真正的行级锁,锁定时是对数据行上锁,而事实上不是。Innodb的行锁实质上是基于索引来实现的,所以就有很多注意事项。下面来具体说说这个问题。
1. Post表中使用如下语句:UPDATEpre_forum_post SET status=1 WHERE pid=123;
这是真正的行级锁,因为pid是唯一键,索引直接定位到这一行。
2. UPDATE pre_forum_post SETstatus=1 WHERE status=0;
由于status没有索引,所以会导致表锁。
3. UPDATE pre_forum_post SETstatus=1 WHERE pid >1 AND pid <10;
这儿用到的索引类型是range,所以pid2~9的行数被锁,如果这时候有另外一个请求更改pid=5的行,也会被放入到写锁队列中。
4. UPDATE pre_forum_post SETstatus=1 WHERE invisible=1 AND pid=1;
如果有一个invisible索引,如果这时候有另外一个语句:
UPDATE pre_forum_post SET status=1 WHERE invisible=1 ANDpid=2;
虽然这两个不指向同一行,但是由于第一句中使用了invisible的所以,所以会导致所有invisible=1的行数全部被锁,所以第二句也不能同时进行操作。
所以由此可见,锁行的精细度是和索引使用的精细度相同的。这一点在使用的时候必须注意了。
INNODB的其他问题
1. 占用更多内存。
2. 锁定速度更慢。
3. SELECT COUNT(*)统计全表时需要遍历所有行。
4. GROUP BY操作效率低下。
INNODB的适用范围
是一个值得尝试的方案,尤其是对于写操作比较频繁的论坛,比如手机论坛这种需要靠回帖挣积分的论坛。不过对于一般小站来说,意义并不是很大。
如果你的论坛有如下情形,建议使用MYISAM。
1. 主要用于展示内容的。
2. 主要用于展示内容和INSERT操作。UPDATE和DELETE操作很少。
3. 站点不大,日PV小于10W。