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

时间:2014-09-08 09:20:40

标签: php mysql sql view

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

我的问题是这几年。

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

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

从select查询创建视图会更好吗?

任何其他想法。

为了澄清,DB是适用于64位Linux的5.5.35-MariaDB。

谢谢。

1 个答案:

答案 0 :(得分:1)

首先,如果您担心性能问题,可以确保您有效地为查询索引数据。仅这一点,如果还没有完成,可以大大改善您所看到的查询时间。

如果您担心自己要查询的数据不会经常更改,但需要可靠地知道您使用的数据是最新的,那么您可以考虑使用{{创建数据的缓存版本3}}

我设想的场景会有一个存储查询中间结果的辅助表(假设它不仅仅是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进行查询,不仅知道您正在查询最近的数据,而且(假设您正在执行复杂的查询来生成数据),您还要预先加载工作以生成插入语句的结果。请注意,这确实会对插入性能产生负面影响,并了解它可以提高查询时的整体性能。

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