我需要更快地进行此查询并需要一些帮助。
代码是:
sqlFrom = "FROM tx_apartment_buy a where result_id" +
"not in (select result_id from tx_user_view2" +
"where product_type='apartmentBuy'" +
"and date_published>='"+yesterdayDate+"' and user_list like '%;"+uid +";%')";
if(StringUtility.isSet(userSql)) {
sqlFrom+=" AND "+userSql;
}
sqlFrom+=" and a.source=? order by batch_no desc," +
"a.date_created asc, a.order_no limit 0,15";
sql = "SELECT * " + sqlFrom;
insertSql = "INSERT INTO tx_user_view2 " +
"(result_id, date_created, product_type, user_list) " +
"SELECT result_id, SYSDATE(), '"+product+"', ';"+uid+";\r\n'" + sqlFrom;
insertSql += " ON DUPLICATE KEY UPDATE user_list = CONCAT(user_list, VALUES(user_list))";
答案 0 :(得分:1)
我无法为您说出或调整此查询。但我建议您通过查看解释计划来构建最终查询。解释计划将告诉您是否正在使用索引,您正在进行多少行扫描,可能您可以从那里开始。用于解释查询
explain select * from dummy_table where x = 'abcd' and y like '%dfs%
and z not in ('ab','cd','ef')
另外,最好不要使用%like%
查询,因为它永远不会遇到索引。
如果使用存储过程,查询性能将进一步提高。应用程序层与数据库层分开。存储过程是数据库的原生过程。例如,当您想要迭代具有10000行的选择查询时,您可以通过应用程序或存储过程来执行此操作。在应用程序层中执行此操作的缺点是您必须以块的形式提供记录(JDBC使用结果集对象无缝地执行此操作),必须进行某种类型的数据传输。这涉及内存大小,传输速度b / w app和db等的延迟。
然而,当您在存储过程中执行此操作时,内存对于数据库是本地的,并且所有处理都可以在那里进行。我不是说你应该完全将应用层与数据库隔离开来,但是当你处理庞大的记录和复杂的查询时,SP仍然会好得多。
答案 1 :(得分:0)
避免从头开始构建String。使用预准备语句,存储过程以及向数据库添加索引。
答案 2 :(得分:0)
如果您可以避免使用嵌套选择查询并使用左连接。特别是左连接对于相邻树模型或父子关系非常有用。