我有一个包含大约10,000个用户的表。我希望按照score
排序前十名,并在列表的组成发生变化或前十名的任何分数发生变化时进行实时更新。
使用触发器执行此操作的最佳方法是什么?这将是一个非常昂贵的触发器来继续运行吗?
答案 0 :(得分:0)
只要您拥有score
的索引,拥有包含以下内容的AFTER UPDATE
触发器FOR EACH ROW
便宜:
IF (SELECT count(*)
FROM (SELECT 1
FROM users
WHERE score > NEW.score
LIMIT 10
) top_users
) < 10
OR
(SELECT count(*)
FROM (SELECT 1
FROM users
WHERE score > OLD.score
LIMIT 10
) top_users
) < 10
THEN
/* your action here */
END IF;
您还需要DELETE
触发器,该触发器仅包含查询的第二部分,而INSERT
触发器仅包含第一部分。
我在这里看到的问题是/* your action here */
这应该是一个简短的操作,比如在队列中添加一些东西,否则你可能会遇到长事务和长锁。