假设我想查找同时出现在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上都有索引),我仍需要此查询快速运行。有没有办法创建包含该查询的视图之类的东西,每次表更改时都会自动更新,以便为我提前准备结果?
答案 0 :(得分:2)
您可以创建一个名为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组合下创建另一个索引,然后查看其中一个索引是否使查询足够快,而不必使用汇总表