H2数据库:聚集索引支持

Posted

技术标签:

【中文标题】H2数据库:聚集索引支持【英文标题】:H2 database: clustered indexes support 【发布时间】:2010-07-22 19:55:54 【问题描述】:

我将 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 是否支持 聚集索引

【问题讨论】:

【参考方案1】:

简答:表的主键必须是 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-tree的数据区域内(大的BLOB、CLOB列除外,它们存储在外部)。

每增加一个索引,就会创建一个新的“索引 b-tree”。这个 b-tree 的 key 由索引列和数据 b-tree 的 key 组成。如果主键是在插入数据后创建的,或者主键包含多列,或者主键不是上面列出的数据类型,则主键存储在新的索引 b-tree 中。

【讨论】:

感谢 Thomas 的回复,这有助于更好地理解 H2。当然,这是一个问题的答案。

以上是关于H2数据库:聚集索引支持的主要内容,如果未能解决你的问题,请参考以下文章

Azure SQL支持堆还是仍然需要聚集索引?

SQL Compact Edition 是不是支持聚集索引?

mysql中的InnoDB和MyISAM

SQL中基于聚集索引和非聚集索引优化查询?

MySQL—2B-Tree,B+Tree,聚集索引,非聚集索引

MYSQL数据库索引类型有哪些