假设我想查找同时出现在 mode=1 和 mode=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 上有索引)。有没有办法创建类似包含此查询的 View 的内容,每次表更改时都会自动更新,以便提前为我准备好结果?
最佳答案
您可以创建一个名为summary_tab 的表。使用编程语言或命令行执行如下查询:
insert into summary_tab
select id from ...
然后,使用 cron 等任务调度程序每隔几分钟执行一次脚本或命令行。
另一个选项是在表上创建一个 AFTER INSERT 触发器,该触发器将执行这样的查询并更新汇总表。但是,如果查询需要很长时间和/或如果您在 tab
表中插入一堆记录,则触发器会减慢插入速度。
你也可以尝试这样的事情:
select id
from tab
where mode in (1, 2)
group by id
having count(*) = 2
检查此查询的速度和结果。如果不是那么快,请尝试在 id 上创建一个索引,在 mode 上创建另一个索引,然后使用 id+mode 组合创建另一个索引,看看其中一个索引是否使查询足够快,以至于您不必使用汇总表.
关于mysql - 自动更新和缓存 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55886069/