Mysql 表锁是否缩放?/行锁对于嵌套集是否更有效?

Mysql 表锁是否缩放?/行锁对于嵌套集是否更有效?,mysql,innodb,myisam,Mysql,Innodb,Myisam,我用它在MyISAM表中存储分层数据;该表由每个用户的几个层次集组成。每个用户将是唯一一个向其各自的树写入的用户,但其他用户可能会从树中读取。节点删除/插入要求同一树中的其他行更新其lft和rgt值,可能会更新数百行 为此,我需要获得一个表写锁,更新树中的其他节点,删除/插入行并解锁表 我想知道的是,表锁是否可以扩展到数百个并发用户?几千 在这种情况下,InnoDB的行锁会更有效吗?锁定数百行,这些行大部分仅由用户自己使用 如果要使用行锁,是否需要添加显式逻辑来处理死锁错误?嗯,两个引擎的锁定原

我用它在MyISAM表中存储分层数据;该表由每个用户的几个层次集组成。每个用户将是唯一一个向其各自的树写入的用户,但其他用户可能会从树中读取。节点删除/插入要求同一树中的其他行更新其lft和rgt值,可能会更新数百行

为此,我需要获得一个表写锁,更新树中的其他节点,删除/插入行并解锁表

我想知道的是,表锁是否可以扩展到数百个并发用户?几千

在这种情况下,InnoDB的行锁会更有效吗?锁定数百行,这些行大部分仅由用户自己使用


如果要使用行锁,是否需要添加显式逻辑来处理死锁错误?

嗯,两个引擎的锁定原理不同

使用MyISAM时,全表锁定的原因是写入通常应该很快。写锁表只需要两个操作,然后将行写入磁盘。由于这个原因,MyISAM的性能实际上受到磁盘速度的限制

有了InnoDB,它就变得更复杂了。由于它完全符合ACID,每次写入都需要4个步骤:锁定行、写入事务日志、将行写入dis、写入事务日志。请注意,它会向磁盘写入三次。这意味着在实践中,InnoDB写操作所需的时间是MyISAM写操作的3倍。这是行级锁定事务的一个原因,也是另一个原因

但这并不是那么容易。对于MyISAM,表锁需要该表的一个信号量。因此,对内存使用和速度的影响充其量是微不足道的。然而,对于InnoDB,每行需要一个索引和一个信号量。它需要一个索引来加快检查速度,以查看该行是否已经有锁。现在,如果您同时更新一行或10行,则没有什么区别。但是,当您谈论数百万行时,内存使用和速度方面的差异是非常重要的,因为它需要横穿要锁定的每一行的锁索引

还有一个额外的权衡。由于InnoDB是ACID兼容的,如果出现断电或其他崩溃,您永远不会处于不一致的状态。数据库中没有未提交的事务数据,也没有已提交的已损坏的事务。如果检测到要修复的内容,它将自动运行事务日志。使用MyISAM,写入过程中的断电或崩溃会使表处于不一致的状态,对此您无能为力。如果你关心你的数据,InnoDB会更好。但是,有了良好的二进制日志和备份系统,您应该能够恢复MyISAM,但它需要一些手动干预

现在,说到这里,你的问题是哪种尺度更好,这真的很难。首先,您的大多数写操作是处理一行还是两行?如果是这样的话,InnoDB和行级锁定将倾向于更好地扩展。如果您执行大量查询,同时更新数万行或更多行,您会注意到MyISAM的性能会更好

至于死锁问题,MySQL将为您定位并处理它们,但它不会执行其中一个查询,因此您可能需要一些异常处理代码来重试查询或其他操作。内部系统将防止死锁


现在,另一个音符。既然MySQL在一个数据库中支持多个引擎,为什么不将数据放入InnoDB中,然后创建一个MyISAM连接表来处理嵌套的集合数据呢?通过父项id机制将父项信息存储在数据表中。这样,您的所有数据都在符合ACID的数据库中,但是您可以通过使用更快的数据读取和较大的写入速度来提高速度,MyISAM用于嵌套的集合逻辑…

嗯,两个引擎之间的锁定原理不同

使用MyISAM时,全表锁定的原因是写入通常应该很快。写锁表只需要两个操作,然后将行写入磁盘。由于这个原因,MyISAM的性能实际上受到磁盘速度的限制

有了InnoDB,它就变得更复杂了。由于它完全符合ACID,每次写入都需要4个步骤:锁定行、写入事务日志、将行写入dis、写入事务日志。请注意,它会向磁盘写入三次。这意味着在实践中,InnoDB写操作所需的时间是MyISAM写操作的3倍。这是行级锁定事务的一个原因,也是另一个原因

但这并不是那么容易。对于MyISAM,表锁需要该表的一个信号量。因此,对内存使用和速度的影响充其量是微不足道的。然而,对于InnoDB,每行需要一个索引和一个信号量。它需要一个索引来加速检查,以查看是否已经有了 争吵。现在,如果您同时更新一行或10行,则没有什么区别。但是,当您谈论数百万行时,内存使用和速度方面的差异是非常重要的,因为它需要横穿要锁定的每一行的锁索引

还有一个额外的权衡。由于InnoDB是ACID兼容的,如果出现断电或其他崩溃,您永远不会处于不一致的状态。数据库中没有未提交的事务数据,也没有已提交的已损坏的事务。如果检测到要修复的内容,它将自动运行事务日志。使用MyISAM,写入过程中的断电或崩溃会使表处于不一致的状态,对此您无能为力。如果你关心你的数据,InnoDB会更好。但是,有了良好的二进制日志和备份系统,您应该能够恢复MyISAM,但它需要一些手动干预

现在,说到这里,你的问题是哪种尺度更好,这真的很难。首先,您的大多数写操作是处理一行还是两行?如果是这样的话,InnoDB和行级锁定将倾向于更好地扩展。如果您执行大量查询,同时更新数万行或更多行,您会注意到MyISAM的性能会更好

至于死锁问题,MySQL将为您定位并处理它们,但它不会执行其中一个查询,因此您可能需要一些异常处理代码来重试查询或其他操作。内部系统将防止死锁

现在,另一个音符。既然MySQL在一个数据库中支持多个引擎,为什么不将数据放入InnoDB中,然后创建一个MyISAM连接表来处理嵌套的集合数据呢?通过父项id机制将父项信息存储在数据表中。这样,您的所有数据都在一个符合ACID的数据库中,但是您可以通过对嵌套的集合逻辑使用更快的MyISAM进行读取和较大的写入来提高速度