略微加速

略速 - 互联网笔记

innodb行级锁

2021-01-12 leiting (2980阅读)

标签 MySql

理论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。


北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3