背景

后端开发中经常和数据库打交道,查询速率和耗时一直是需要关注的点。行锁和表锁是其中重要的知识点,而理解它们又绕不开索引。

索引为什么能提升查询速度

以 InnoDB 的 B+ 树索引为例。假设有一个数值类型的 id 字段,有 1, 3, 4, 5 四条记录:

  • 无索引:数据按顺序排列,查询需要逐条遍历,时间复杂度 O(n)
  • 有索引:B+ 树结构类似平衡二叉树(左小右大),查询时间复杂度 O(log n)

这就是加索引能大幅提升查询速率的核心原因。

行锁与表锁

有了索引的基础,再看锁就清晰了:

  • 行锁:基于索引字段的增删改语句,会锁定对应的索引行。其他事务可以操作表中其他索引行的数据,并发度高
  • 表锁:不基于索引字段的 SQL(如全表扫描),会锁住整张表,其他 SQL 需要等待,效率低

所以在写业务 SQL 时,尽量基于索引字段操作,既能提升查询效率,又能利用行锁减少锁冲突。

小结

  • 索引是行锁的前提,没有索引的 SQL 会退化到表锁
  • 行锁粒度小,并发度高;表锁粒度大,适合批量操作但并发差
  • 业务中尽量通过索引字段来操作数据,避免无意中触发表锁

参考:CSDN - 行锁和表锁