Mysql 自动更新和缓存视图

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的表。使用编程语言或命令行执行如

假设我要查找同时出现在模式=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的表。使用编程语言或命令行执行如下查询:

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的组合上创建另一个索引,看看其中一个索引是否能使查询足够快,从而不必使用摘要表