计算连接查询行数的最快方法
Posted
技术标签:
【中文标题】计算连接查询行数的最快方法【英文标题】:Most speed way to count rows of a join query 【发布时间】:2019-04-24 12:10:54 【问题描述】:我想在java中通过mysql jdbc执行以下查询:SELECT COUNT (*) FROM ORDERS, CUSTOMER WHERE O_ORDEYKEY = O_CUSTKEY
我有这个代码:
Connection conn = new DatabaseConnection().createMySQLConnection();
int totalRows=0;
for(int j=0;j<tables.size();j++)
Statement stmt = null;
ResultSet rs = null;
int rowCount = -1;
try
conn.setAutoCommit(false);
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tables.get(j)
+ " WHERE O_ORDERKEY = O_CUSTKEY;");
rs.next();
rowCount = rs.getInt(1);
totalRows= totalRows+rowCount;
finally
rs.close();
stmt.close();
但我想更快地运行它。我该怎么做?
【问题讨论】:
我认为您在其中缺少"
添加到 @RiggsFolly 的评论 java 至少支持 JDK 8 中的 prepared statements 以防止 SQL 注入,我建议您使用它们
“但我想更快地运行它。我该怎么做?”索引很可能会有所帮助。
This 可能会有所帮助 - 将相同的概念应用于您的特定数据库。
要添加到@RaymondNijland 评论 SQL 一直以来都有 JOIN 语法,您也将从学习中受益
【参考方案1】:
为了便于阅读,您应该避免使用基于 where 的旧隐式连接语法,并使用 SQL 标准(自 1992 年以来)显式连接语法:
SELECT COUNT (*)
FROM ORDERS
INNER JOIN CUSTOMER ON ORDERS.O_ORDEYKEY = CUSTOMER.O_CUSTKEY
为了获得更好的性能,请确保您有一个索引:
表 ORDERS 列 O_ORDEYKEY
表 CUSTOMER 列 O_CUSTKEY
【讨论】:
@programmer 新的 JOIN 语法也比 ansi 逗号连接语法更好,因为使用旧的 ansi 逗号连接语法,您只能进行内部连接或交叉连接。较新的连接 SQL 标准语法还定义了左连接和右连接(并非所有数据库都支持右连接),这意味着您有更多的选项具有更好的可读性以上是关于计算连接查询行数的最快方法的主要内容,如果未能解决你的问题,请参考以下文章