java - H2 - 在链接表上创建索引并在链接表上执行 JOIN
问题描述
我有一个 MySQL 表tableName
,table2
上面定义了索引。
我在我的 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?
解决方案
由于不经意的原因,您无法在 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 执行,它应该相对较快。
推荐阅读
- javascript - js函数在窗口调整大小时重复
- react-native - 通过 CLI 初始化 React Native awsomeProject 时出错
- python - 将python中的一个模块的功能导入同一项目中的另一个模块的最简单/直接的方法是什么?
- reactjs - 使用 getInitialProps 在 Next JS 中将值从服务器端传递到客户端
- visual-studio-code - VS Code 编辑器中 package.json 中的鬼信调试
- c# - 带有 ViewBag 的 DropDownListFor 不传递值
- c++ - 在 C++ 中实现嵌套循环的任何更短的方法?
- excel - Google Places API(附近搜索)不返回结果
- ios - 拖动以关闭 UIPresentationController
- java - 即使使用很长的错误答案,如何克服整数溢出问题?