我需要让这个查询更快,需要一些帮助。
代码是:
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))";发布于 2011-11-26 23:40:34
我不能为你说或调优这个查询。但我建议您通过查看explain计划来构造最终查询。explain计划将告诉您是否正在使用索引,您正在进行多少行扫描,也许您可以从那里开始。用来解释一个查询
explain select * from dummy_table where x = 'abcd' and y like '%dfs%
and z not in ('ab','cd','ef')另外,最好不要使用%like%进行查询,因为它永远不会命中索引。
如果使用存储过程,查询性能将进一步提高。应用层与数据库层是分开的。存储过程是数据库的本机过程。例如,当您想要迭代一个有10000行的select查询时,您可以通过应用程序或存储过程来完成。在应用层这样做的缺点是你将不得不在块中带来记录(JDBC使用resultset对象无缝地为你做这件事),某种类型的数据传输必须发生。这涉及关于存储器大小、传输速度b/w app和db等的延迟。
然而,当您在存储过程中执行此操作时,内存是数据库的本地内存,所有处理都可以在那里进行。我并不是说您应该将应用程序层与数据库完全隔离,但SP仍然要好得多,特别是当您处理大量记录和复杂查询时。
发布于 2011-11-26 23:43:31
避免从头开始构建字符串。使用准备好的语句、存储过程,并向数据库中添加索引。
发布于 2011-11-26 23:46:55
如果可以避免嵌套的select查询,而使用左联接。尤其是左连接对于相邻的树模型或父子关系非常有用。
https://stackoverflow.com/questions/8279466
复制相似问题