首页 > 解决方案 > H2 - 在链接表上创建索引并在链接表上执行 JOIN

问题描述

我有一个 MySQL 表tableNametable2上面定义了索引。

我在我的 Java 应用程序中创建了一个tableName带有此查询的链接表:

CREATE LINKED TABLE IF NOT EXISTS tableName('', 'jdbc:mysql://hostName:port/dbName', 'user', 'pass', 'tableName');

相同的查询table2

然后我tableSelect使用查询在 H2 数据库中创建:

CREATE TABLE tableSelect AS SELECT * FROM tableName WHERE Sex = 'F'

table2现在我的 Java 应用程序使用此查询创建一个索引(如果不存在) :

CREATE INDEX IF NOT EXISTS DES ON table2(DES);

当我单击按钮重新运行查询时,它给了我这样的错误: org.h2.jdbc.JdbcSQLException: Feature not supported: "LINK"; SQL statement:

此外,如果定义了索引,我JOIN会对已经定义的索引执行 a ,但它太慢了。查询JOIN涉及H2中的一个表和MySQL中的一个表,即链接表,它是这样的:

CREATE TABLE tableNew AS SELECT l.*, CONTR AS Activity FROM t AS ableSelect JOIN table2 AS agg ON l.Contr_Type = agg.DES;

如何优化此 JOIN?

标签: javah2

解决方案


由于不经意的原因,您无法在 H2 中的链接表上创建索引。但是你可以在 MySQL 中创建这样的索引并且它会被使用。但是,您需要连接许多您查询的行无论如何都会很慢。

您可以在 H2 中从 MySQL 创建一个额外的临时表CREATE TABLE newName AS SELECT … FROM linkedTable副本,在该副本中创建所有必要的索引,并在您的JOIN而不是链接表中使用它。当然,这个副本不会反映在 MySQL 数据库中执行的更改。

如果两边都是JOIN链接表,您可以使用查询创建链接表并使用它。

CREATE LINKED TABLE tableName('', 'jdbc:…', 'user', 'password', '(SELECT … FROM … JOIN … ON …)');

这样的查询将由 MySQL 执行,它应该相对较快。


推荐阅读