更快地进行MySQL查询

时间:2011-11-26 15:32:55

标签: java mysql performance query-optimization

我需要更快地进行此查询并需要一些帮助。

代码是:

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))";

3 个答案:

答案 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)

如果您可以避免使用嵌套选择查询并使用左连接。特别是左连接对于相邻树模型或父子关系非常有用。