0

请多多包涵,因为我对词汇毫无希望,而且我自己的搜索也无济于事。

我在这里了解到,如果我以我想要的方式更新 sGROUP_CONCAT也存储在用户定义的变量中),我将锁定整个表。

我相当确定最好的方法是UPDATE在 a 中逐行排列CURSOR,从最高的 PK id 开始,然后递减,因为我确信发生死锁、冲突或其他任何事情的可能性会更低。 (告诉你我的词汇不好)如果我从最近的记录开始。

为 d 的列UPDATE没有索引。

我刚刚在这里发现默认情况下aTRIGGER是 a TRANSACTION,所以我将创建一个 proc 并从 php.ini 调用。

事务隔离级别为REPEATABLE-READ.

我更关心这些重叠UPDATE的 s 会导致死锁而没有发生任何事情,而不是它们需要时间来完成。

所有表 InnoDB。

所有SELECTs 和s在 PK id 上UPDATE都是d,除了表中的which s 所有 id 都是d。没有加入。没有混乱。别大惊小怪。 WHERECURSOR SELECTSELECTUPDATE

也就是说,最后是问题:

  1. 会只有一次,DECLARE还是也会循环(我更喜欢它只一次)?SELECTSELECTSELECT
  2. DECLARE' ' 的锁会SELECT在 proc 期间保留吗(我希望它尽快释放)?
  3. 查询完成后是否会立即释放每个行的锁UPDATE,还是会在整个过程中保留(我希望在单个UPDATE查询完成后释放行锁)?
  4. 用户变量的SELECTs 是否也会在设置后发布(您猜对了:我更喜欢那些也尽快发布)?
  5. 是否有可能使用行锁仍然SELECTUPDATEd 行(再次,如果可以的话,我更喜欢)?

提前谢谢了!

为什么UPDATE都开INSERT

在我的网站(在我的个人资料中),我允许用户访问所有提交的链接。这在顺序的基础上很好,我只是引用 id。

但是,我还将它们在 3 种投票类型的自定义算法的组合百分位上进行排名,对 3 种进行同等加权。

问题是在我的算法中,每张选票都会影响所有其他选票。由于我的算法的性质,没有办法解决这个问题。

一经请求

我用 PHP 尝试了这条路线。不去。计较太多了。我不太关心用户立即获得准确数据,因为页面会自动更新用户的排名,而用户并不聪明,但我不能让用户永远等待,因为我允许快速动态分页。

在视图中计算是更大的灾难。

4

1 回答 1

1
  • DECLARE'sSELECT只会选择一次,但恐怕这对你没有帮助......
  • SELECT游标可能会锁定某些内容- 它取决于您的存储引擎:它可以是表、页、行或什么都OPEN没有CLOSE
  • UPDATE只要更新需要,就会锁定。同样,根据您的存储引擎,锁可以是表、页或行(但显然不是什么都没有)

但是您可能会考虑一种完全不同的方法:IIUC,您基本上想要一些排名或百分位数匹配,并且您尝试通过对每个INSERT. 这在我的 POV 中有一个大问题:您计算了很多很多不需要的值。如果只计算读取操作会发生什么?

  • 如果在两次读取操作之间总是恰好有一个 INSERT,则必须重新计算 allways - 与现在计算 allways 相同的情况。
  • 如果两次读取操作之间没有 INSERTs,MySQL 查询缓存会保留之前计算的结果,不会重新运行查询,所以你计算的少。
  • 如果两次读取操作之间有超过 1 个 INSERTs,则 N 次插入只需要计算一次。

因此,按需计算排名/百分位数永远不会比在 上计算更昂贵INSERT,但它有可能显着降低成本。

于 2013-01-09T00:34:21.637 回答