我使用 H2 数据库来存储包含大量时间序列的环境数据。时间序列只是定期(例如每小时一次)记录在数据库中的传感器的测量值。
表中存储的数据:
CREATE TABLE hydr
(dt timestamp
,value double
,sensorid int)
我想对表进行范围查询,例如:
select * from hydr
where dt between '2010-01-01' and '2010-10-01'
为了提高性能,我想在 dt 列上构建聚集索引,但问题是,我还没有发现 H2 是否支持聚集索引。有谁知道如果聚集索引H2 支持吗?
简短回答:表的主键必须是 BIGINT 类型:
CREATE TABLE hydr(dt bigint primary key, value double, sensorid int);
在本例中,该表是使用“dt”列组织的。这称为“聚集索引”。不支持 TIMESTAMP 数据类型,主要是因为它还包含纳秒。您可以做的是将 unix 时间戳(自 1970 年以来的毫秒数)存储为 BIGINT。
长答案:关于数据如何在 H2 内部存储的文档很差。我会将以下部分添加到 H2 数据库的“性能”文档中。我希望这能解决问题(如果没有,请告诉我):
数据如何内部存储
对于持久性数据库,如果使用 BIGINT、INT、SMALLINT、TINYINT 类型的单列主键创建表,则表的数据就是这样组织的。这有时也称为“聚集索引”或“索引组织表”。
H2内部以B树的形式存储表数据和索引。每个 B 树将条目存储为唯一键(一列或多列)和数据(零列或多列)的列表。表数据始终以“数据 B 树”的形式组织,并具有 long 类型的单个列键。如果创建表时指定了 BIGINT、INT、SMALLINT、TINYINT 类型的单列主键,则该列将用作数据 B 树的键。如果没有指定主键,或者主键列是其他数据类型,或者主键包含多个列,则表中会添加一个 BIGINT 类型的隐藏自增列,用作数据 B 树的键。表的所有其他列都存储在该数据 B 树的数据区域内(大 BLOB、CLOB 列除外,它们存储在外部)。
对于每个附加索引,都会创建一个新的“索引 B 树”。该 B 树的键由索引列加上数据 B 树的键组成。如果在插入数据后创建主键,或者主键包含多个列,或者主键不是上面列出的数据类型,则主键将存储在新的索引 B 树中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)