mysql - 自动更新和缓存 View

标签 mysql

假设我想查找同时出现在 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/

相关文章:

php - 将来自多个文本字段的数据插入 MYSQL 数据库

php - mysql - 使用大表 200k 行

mysql - 如何使用 Hibernate 在 Struts 2 中的 mySql DB 的 jsp 页面中显示图像(blob 类型)

php - 如何使用 PHP 中的独立文本框更新多个已检查记录

php - 从 MySQL 数据库获取 0 结果,而我的查询和数据库名称一切都是正确的

java - 为什么这个数据库同步例程失败?

mysql - SQL 左连接查询区别

mysql - SQL 中的排列

mysql - SQL WHERE 语句多列 LIKE 一个值

mysql复制需要有两台master服务器