我有一个包含400万行数据的数据库(DB)。一个字段是“时间戳”类型。来自DB的数据显示在一系列web页面上(过于简单,不能称之为网站)。在第一页中,我从“时间戳”字段中提取所有可用的年份。大约需要8-10秒。数据是实时测量,从2009年到2014年不等。每周上传一次随机时段的数据。
我的问题是关于这些年。
处理这类信息(接近静态)的最佳方法是什么?
我现在所做的是提取数据一次,然后将其存储在一个会话变量中以供进一步使用。
从select查询创建视图更好吗?
任何其他的想法。
澄清一下,64位Linux的DB是5.5.35-MariaDB。
谢谢。
发布于 2014-09-08 11:43:05
首先,如果您关心性能,您可能会确保有效地为查询索引数据。仅这一点,如果还没有完成,可能会大大提高您所看到的查询时间。
如果您担心查询的数据不频繁更改,但需要可靠地知道您正在使用的数据是当前的,您可以考虑使用插入触发器创建数据的缓存版本。
我设想的场景将有一个二级表来存储查询的中间结果(假设它不仅仅是一个SELECT date FROM myFirstTable
类型的查询)。我将使用以下查询来说明我的情况(假装这代表了您的第一页数据):
SELECT date, COUNT(date) AS numberOf FROM myFirstTable GROUP BY date ORDER BY date ASC;
现在,如果不频繁地更改这些信息,我可能希望将此查询的结果缓存在中间表中(这将是生成页面时所使用的数据源)。在myFirstTable上有一个插入触发器,根据需要重新计算这些数据,您可以确保该表中的内容是当前的(假设存在中间表mySecondTable ( 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进行查询,因为您不仅知道正在查询最近的数据,而且(假设您正在进行复杂的查询以生成数据),您还预先加载了在insert语句上生成结果的工作。请注意,这确实会对插入性能产生不利影响,但有一项理解,即它在查询时会提高总体性能。
上面的代码是未经测试的,而且不知道您的确切情况(例如您正在运行的查询、表的名称,以及您是否能够创建新的表),我不知道这完全解决了您的问题。
https://stackoverflow.com/questions/25720936
复制相似问题