Mysql 自动更新和缓存视图
假设我要查找同时出现在模式=1和模式=2中的ID:Mysql 自动更新和缓存视图,mysql,Mysql,假设我要查找同时出现在模式=1和模式=2中的ID: SELECT id FROM tab a WHERE mode=1 and (SELECT COUNT(*) from tab b where b.mode=2 and a.id=b.id) = 0 我需要快速运行这个查询,即使该表包含数百万行(在id1和id2上已经有索引)。是否有一种方法可以创建包含此查询的视图,该视图在每次表更改时自动更新,以便提前为我准备结果?您可以创建一个名为summary\u tab的表。使用编程语言或命令行执行如
SELECT id FROM tab a WHERE mode=1 and (SELECT COUNT(*) from tab b where b.mode=2 and a.id=b.id) = 0
我需要快速运行这个查询,即使该表包含数百万行(在id1和id2上已经有索引)。是否有一种方法可以创建包含此查询的视图,该视图在每次表更改时自动更新,以便提前为我准备结果?您可以创建一个名为summary\u tab的表。使用编程语言或命令行执行如下查询:
insert into summary_tab
select id from ...
select id
from tab
where mode in (1, 2)
group by id
having count(*) = 2
然后,使用像cron这样的任务调度器每隔几分钟执行一次脚本或命令行
另一个选项是在表上创建一个AFTER INSERT触发器,该触发器将执行这样的查询并更新summary table。但是,如果查询需要很长时间和/或在tab
表中插入一组记录,触发器将减慢插入速度
您也可以尝试以下方法:
insert into summary_tab
select id from ...
select id
from tab
where mode in (1, 2)
group by id
having count(*) = 2
检查此查询的速度和结果。如果没有那么快,请尝试在id上创建一个索引,在模式上创建另一个索引,再结合id+模式创建另一个索引,然后查看其中一个索引是否使查询速度足够快,以至于您不必使用摘要表。您可以创建一个名为摘要选项卡的表。使用编程语言或命令行执行如下查询:
insert into summary_tab
select id from ...
select id
from tab
where mode in (1, 2)
group by id
having count(*) = 2
然后,使用像cron这样的任务调度器每隔几分钟执行一次脚本或命令行
另一个选项是在表上创建一个AFTER INSERT触发器,该触发器将执行这样的查询并更新summary table。但是,如果查询需要很长时间和/或在tab
表中插入一组记录,触发器将减慢插入速度
您也可以尝试以下方法:
insert into summary_tab
select id from ...
select id
from tab
where mode in (1, 2)
group by id
having count(*) = 2
检查此查询的速度和结果。如果没有那么快,试着在id上创建一个索引,在mode上创建另一个索引,再在id+mode的组合上创建另一个索引,看看其中一个索引是否能使查询足够快,从而不必使用摘要表