我正在使用一个表,为了这个问题的目的,这个表定义如下
CREATE TABLE players (match_id, hero_id, player_slot);
此表经常更新(每20分钟左右进行一次事务,大约有1000个插入)。它包含大约600万行atm,但会不断增长。我想从最新的表中读取(再次,非常频繁)以下SELECT语句。
SELECT t1.match_id,
GROUP_CONCAT(hero_id) AS team,
COUNT(DISTINCT hero_id) AS team_size
FROM (SELECT match_id, hero_id
FROM players
WHERE player_slot in (1, 2, 3, 4, 5)
ORDER BY hero_id) t1
GROUP BY t1.match_id;
这是一个非常简化的查询版本,但每次我想要更新版本时运行速度仍然很慢。因此,我的希望是设置一个单独的表并触发插入“玩家”表。幸运的是,我将始终在一个语句中插入具有给定match_id的所有记录,例如
INSERT INTO players (match_id, hero_id, player_slot) VALUES
(1, 2, 3),
(1, 4, 4),
(1, 8, 5);
我想写一个触发器来触发这些插入;排序,然后对插入的行进行分组。我还没有找到如何在任何地方这样做。似乎不可能将所有行作为可以执行GROUP BY和ORDER BY的单个表插入。有没有一种有效的方法来做到这一点?如果没有,那么会有足够快的解决方法吗?
答案 0 :(得分:2)
此查询无法加速; WHERE和ORDER BY子句冲突,不能使用相同的索引;并且rule 15可以防止内部查询变平(可能允许外部查询使用某个索引)。
此时SQLite仅支持FOR EACH ROW触发器,而不支持FOR EACH STATEMENT触发器。
因此无法自动填充缓存表;在您撰写match_id
之后,您必须从代码更新缓存。