请耐心等待我,因为我对词汇量毫无希望,而且我自己的搜索也无法进行。
我已经了解here如果我按照我想要here的方式更新(GROUP_CONCAT
也存储在用户定义的变量中),我会锁定整个桌子。
我相当确定最好的方法是在UPDATE
中逐行CURSOR
,从最高的PK ID开始然后降序,因为我确定我会有一个如果我从最近的记录开始,就会降低陷入僵局或冲突的可能性(或者告诉你我的词汇很糟糕)。
UPDATE
d列没有索引。
我发现here默认情况下TRIGGER
是一个TRANSACTION
,所以我将改为使用proc并从php调用。
事务隔离级别为REPEATABLE-READ
。
我更关注这些重叠的UPDATE
导致死锁,没有任何事情发生,而不是花时间完成。
所有表格InnoDB。
所有SELECT
和UPDATE
都是PK {1}},除了WHERE
CURSOR
SELECT
所有ID正在SELECT
的表格。没有加入。没有麻烦。别大惊小怪。
那就是说,最后是问题:
UPDATE
DECLARE
SELECT
只会SELECT
一次,或者也会循环(我只希望它SELECT
一次)?DECLARE
的{{1}}锁是否会在proc期间保持不变(我希望它尽快释放)?SELECT
版本的行都会锁定,还是会在proc的持续时间内保留(我更喜欢个人UPDATE
之后的行锁定版本查询已经finshed)?UPDATE
是否也会在设置后释放(您猜对了:我更喜欢那些也尽快发布)?SELECT
行SELECT
d(再次,我更愿意,如果可以的话)?非常感谢提前!
为什么UPDATE
全部UPDATE
在我的网站(在我的个人资料中)中,我允许用户访问所有提交的链接。这是顺序的,我只是引用id。
但是,我也将它们排在3种投票类型的自定义算法的组合百分位数上,同样权衡3。
问题在于,在我的算法中,每次投票都会影响所有其他投票。由于我的算法的性质,没有办法解决这个问题。
点播
我用PHP尝试了这条路线。不行。计算太多了。我不太关心用户有正确立即的数据,因为该页面将自动更新用户的排名而用户不是更明智,但我不能让用户永远等待,因为我允许快速动态分页。
在视野中计算是一场更大的灾难。
答案 0 :(得分:1)
DECLARE
的{{1}}只会选择一次,但我担心,这对您没有帮助...... SELECT
光标可能会将某些内容从SELECT
锁定到OPEN
- 它取决于您的存储引擎:它可以是表格,页面,行或没有CLOSE
就会锁定。同样,根据您的存储引擎,锁可以是表,页或行(但显然不是什么)但你可能会考虑一种完全不同的方法:IIUC,你基本上想要一些排名或百分位匹配,你试图通过对每个UPDATE
作出反应来做到这一点。这在我的POV中有一个很大的问题:你计算了很多很多不需要的值。如果只计算读数操作,会发生什么?
INSERT
,则必须重新计算 - 与您现在计算的情况相同。INSERT
,则MySQL查询缓存将保留先前计算的结果,并且不会重新运行查询,因此您计算得更少。 INSERT
,则只需对N次插入计算一次。因此,根据需要计算等级<百分位数 永远不会比在INSERT
上计算贵,但它有可能显着降低成本。