我有一个包含约400万行数据的数据库(DB)。一个字段是“时间戳”类型。 来自数据库的数据显示在一系列网页上进行了总结(太简单了,不能称之为网站)。在第一页上,我从“时间戳”字段中提取所有可用年份。大约需要8-10秒。数据是实时测量,范围从2009年到2014年。数据每周上传一次。
我的问题是这几年。
处理此类信息的最佳方式是什么(接近静态)?
我现在所做的是提取一次数据,然后将其存储在会话变量中以供进一步使用。
从select查询创建视图会更好吗?
任何其他想法。
为了澄清,DB是适用于64位Linux的5.5.35-MariaDB。
谢谢。
答案 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进行查询,不仅知道您正在查询最近的数据,而且(假设您正在执行复杂的查询来生成数据),您还要预先加载工作以生成插入语句的结果。请注意,这确实会对插入性能产生负面影响,并了解它可以提高查询时的整体性能。
以上代码未经测试,并且不知道您的确切情况(例如您正在运行的查询,表的名称,是否能够创建新表)我不知道这完全解决了您的问题。