Mysql(MariaDB)每次查询与从视图中读取?

Posted

技术标签:

【中文标题】Mysql(MariaDB)每次查询与从视图中读取?【英文标题】:Mysql (MariaDB) query every time vs read from a view? 【发布时间】:2014-09-08 09:20:40 【问题描述】:

我有一个包含约 400 万行数据的数据库 (DB)。一个字段是“时间戳”类型。 来自数据库的数据显示在一系列网页上(太简单了,不能称之为网站)。在第一页,我从“时间戳”字段中提取所有可用年份。大约需要8-10秒。数据是实时测量数据,范围从 2009 年到 2014 年。数据每周上传一次随机时间段。

我的问题是关于那几年的。

处理此类信息(接近静态)的最佳方式是什么?

我现在要做的是提取一次数据,然后将其存储在会话变量中以供进一步使用。

从选择查询创建视图更好吗?

任何其他想法。

澄清一下,DB 是 5.5.35-MariaDB for 64bit Linux。

谢谢。

【问题讨论】:

【参考方案1】:

首先,如果您关心性能,您可以确保您有效地为查询索引数据。仅此一项,如果尚未完成,就可以显着改善您所看到的查询时间。

如果您担心查询不经常更改的数据,但需要可靠地知道您正在使用的数据是最新的,您可以考虑使用 @987654321 创建数据的缓存版本@。

我设想的场景将有一个存储查询的中间结果的辅助表(假设它不仅仅是SELECT date FROM myFirstTable 类型的查询)。我将使用以下查询来说明我的情况(假设这代表您的第一页数据):

SELECT date, COUNT(date) AS numberOf FROM myFirstTable GROUP BY date ORDER BY date ASC;

现在,假设此信息不经常更改,我可能希望将此查询的结果缓存在一个中间表中(这将是您在生成页面时查询的数据源)。使用 myFirstTable 上的 INSERT 触发器,它会根据需要重新计算此数据,您可以确保该表中的内容是最新的(假设存在中间表 mySecondTable (date DATE, numberOf INT):

CREATE TRIGGER trg_ins_myFirstTable AFTER INSERT ON myFirstTable
    FOR EACH ROW
    BEGIN
        -- flush out intermediate results:
        TRUNCATE TABLE mySecondTable;

        -- rebuild dataset:
        INSERT INTO mySecondTable (date, numberOf)
            SELECT date, COUNT(date) AS numberOf
                FROM myFirstTable
                GROUP BY date
                ORDER BY date ASC;
    END;

此后,您将从 mySecondTable 而不是 myFirstTable 进行查询,因为您不仅知道您正在查询最近的数据,而且(假设您正在执行复杂的查询来生成数据)您还预先加载了要生成的工作插入语句的结果。请注意,这确实会对插入性能产生不利影响,但要知道它会提高查询时的整体性能。

上面的代码未经测试,并且不知道您的确切情况(例如您正在运行的查询、表的名称、您是否能够创建新表)我不知道这是否可以完美地解决您的问题。

【讨论】:

感谢您的想法。我以前没有使用过触发器,但这将是一个尝试它们的绝佳机会。再次感谢:) 我阅读了触发器语法的描述。在一次数据上传中,我有数百个插入。有没有办法在关闭连接之前最后一次插入之后执行触发器?谢谢 您有正当的顾虑;如果您一次进行一系列插入,我的理解是触发器会立即被调用。我看到您可以使用两种可能的替代方案:Events(推迟/安排缓存代码的执行)或将您的选择替换为在从中选择之前构建缓存副本的stored procedure。如果您使用存储过程,您可能会使用插入触发器在某处设置“脏”标志。 最后我做了一个事件来每周填充一次中间表。感谢您的宝贵时间。

以上是关于Mysql(MariaDB)每次查询与从视图中读取?的主要内容,如果未能解决你的问题,请参考以下文章

mysql之视图存储过程触发器约束授权

MySQL/MariaDB视图

MySQL/MariaDB:创建数据透视表视图

使用 PySpark 从 MariaDB 读取查询 [重复]

MariaDB:使用 SET @variable 从查询创建视图

子查询 MYSQL 以从服务器中选择所有数据库