行锁和表锁
背景
后端开发中经常和数据库打交道,查询速率和耗时一直是需要关注的点。行锁和表锁是其中重要的知识点,而理解它们又绕不开索引。
索引为什么能提升查询速度
以 InnoDB 的 B+ 树索引为例。假设有一个数值类型的 id 字段,有 1, 3, 4, 5 四条记录:
- 无索引:数据按顺序排列,查询需要逐条遍历,时间复杂度 O(n)
- 有索引:B+ 树结构类似平衡二叉树(左小右大),查询时间复杂度 O(log n)
这就是加索引能大幅提升查询速率的核心原因。
行锁与表锁
有了索引的基础,再看锁就清晰了:
- 行锁:基于索引字段的增删改语句,会锁定对应的索引行。其他事务可以操作表中其他索引行的数据,并发度高
- 表锁:不基于索引字段的 SQL(如全表扫描),会锁住整张表,其他 SQL 需要等待,效率低
所以在写业务 SQL 时,尽量基于索引字段操作,既能提升查询效率,又能利用行锁减少锁冲突。
小结
- 索引是行锁的前提,没有索引的 SQL 会退化到表锁
- 行锁粒度小,并发度高;表锁粒度大,适合批量操作但并发差
- 业务中尽量通过索引字段来操作数据,避免无意中触发表锁
参考:CSDN - 行锁和表锁
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Alignm-ent!
