Mariadb 是否有一种高效、可靠的方法来确定mysql中表集合的上次更新时间?

Mariadb 是否有一种高效、可靠的方法来确定mysql中表集合的上次更新时间?,mariadb,innodb,galera,Mariadb,Innodb,Galera,经典问题:我有许多客户端应用程序(本地和web应用程序)连接到一个系统,所有这些应用程序都需要随着信息的变化实时更新。大多数信息很少改变。当它这样做时,客户端系统需要非常快地了解这一点。后端系统在Galera集群中使用MariaDB,InnoDB作为存储引擎 我知道您可以使用INFORMATION_模式来解决这类问题,但在使用INNODB表时,它是不确定的,尤其是在Galera集群环境中。如果我依赖于所讨论的表的更新时间,它可能会因为内存缓冲而稍微过时。在任何给定时刻,集群中的不同服务器此时也可

经典问题:我有许多客户端应用程序(本地和web应用程序)连接到一个系统,所有这些应用程序都需要随着信息的变化实时更新。大多数信息很少改变。当它这样做时,客户端系统需要非常快地了解这一点。后端系统在Galera集群中使用MariaDB,InnoDB作为存储引擎

我知道您可以使用INFORMATION_模式来解决这类问题,但在使用INNODB表时,它是不确定的,尤其是在Galera集群环境中。如果我依赖于所讨论的表的更新时间,它可能会因为内存缓冲而稍微过时。在任何给定时刻,集群中的不同服务器此时也可能具有不同的值。这有什么大不了的吗?我对此表示怀疑。但我一直在寻找一个能给我提供准确数据的解决方案,而且效果很好

有问题的每个表都有一个带有索引的“updated_at”列。我曾尝试单独查询每个表(例如,
从表顺序中选择updated\u at,按updated\u at limit 1
),但当有很多表要检查时,这是非常昂贵的。存储过程使这一点更有效率,但仍然感觉不雅观

例如,触发器在这里有意义吗?与表上的读取活动相比,表更新相对较少。我是否可以在每个表上设置一个insert/delete/update触发器,该触发器在另一个表中更新了相应的上次更新时间?然后监视该表以确定我关心的数据是否已更改?我是否应该使用某种发布/订阅方式来表示“带外”数据已更改?那么,那些关心的人会订阅吗


这是一个必须解决的问题。有人有什么好的解决方案可以推荐吗?

您可以通过以下方式跨元数据查询:

SELECT MAX(UPDATE_TIME)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'myschema'
但是你说元数据对你来说不够精确

您必须在处从多个表中获取最新的
更新信息:

SELECT MAX(updated_at) AS max_updated_at
FROM (
    SELECT MAX(updated_at) AS updated_at FROM mytable1
    UNION SELECT MAX(updated_at) FROM mytable2
    UNION SELECT MAX(updated_at) FROM mytable3
    UNION SELECT MAX(updated_at) FROM mytable4
    UNION ...
) AS t
或者:

SELECT GREATEST(
    t1.updated_at,
    t2.updated_at,
    t3.updated_at,
    t4.updated_at,
    ...
  ) AS max_updated_at
FROM
(SELECT MAX(updated_at) AS updated_at FROM mytable1) AS t1, 
(SELECT MAX(updated_at) AS updated_at FROM mytable2) AS t2,
(SELECT MAX(updated_at) AS updated_at FROM mytable3) AS t3,
(SELECT MAX(updated_at) AS updated_at FROM mytable4) AS t4,
... 

请回复您的评论:

抱歉误解了你的问题。我假设“表集合的上次更新时间”是指集合的最新更新时间

要获得每个表的最后更新,我们可以调整我上面显示的三个备选方案中的任何一个:

SELECT TABLE_NAME, UPDATE_TIME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'myschema'
或:

或:


如果表的
updated\u at
列有索引,MySQL可以从索引中的最后一个条目快速获取
MAX()
值,而无需扫描整个表。

您可以通过以下方式跨元数据查询:

SELECT MAX(UPDATE_TIME)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'myschema'
但是你说元数据对你来说不够精确

您必须在
处从多个表中获取最新的
更新信息:

SELECT MAX(updated_at) AS max_updated_at
FROM (
    SELECT MAX(updated_at) AS updated_at FROM mytable1
    UNION SELECT MAX(updated_at) FROM mytable2
    UNION SELECT MAX(updated_at) FROM mytable3
    UNION SELECT MAX(updated_at) FROM mytable4
    UNION ...
) AS t
或者:

SELECT GREATEST(
    t1.updated_at,
    t2.updated_at,
    t3.updated_at,
    t4.updated_at,
    ...
  ) AS max_updated_at
FROM
(SELECT MAX(updated_at) AS updated_at FROM mytable1) AS t1, 
(SELECT MAX(updated_at) AS updated_at FROM mytable2) AS t2,
(SELECT MAX(updated_at) AS updated_at FROM mytable3) AS t3,
(SELECT MAX(updated_at) AS updated_at FROM mytable4) AS t4,
... 

请回复您的评论:

抱歉误解了你的问题。我假设“表集合的上次更新时间”是指集合的最新更新时间

要获得每个表的最后更新,我们可以调整我上面显示的三个备选方案中的任何一个:

SELECT TABLE_NAME, UPDATE_TIME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'myschema'
或:

或:


如果表的
updated\u at
列有索引,MySQL可以从索引中的最后一个条目快速获取
MAX()
值,而无需扫描整个表。

我不查找最近更新的表。我正在查找每个表的最新更新时间。但是我想我看到了如何使用MAX(updated_at)对所有表进行查询。我担心它可能会有点慢,但我会测试它。我不寻找最近更新的表。我正在查找每个表的最新更新时间。但是我想我看到了如何使用MAX(updated_at)对所有表进行查询。我担心它可能有点慢,但我会测试它。