首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高MySQL查询速度

问提高MySQL查询速度
EN

Stack Overflow用户
提问于 2011-11-26 23:32:55
回答 3查看 1K关注 0票数 1

我需要让这个查询更快,需要一些帮助。

代码是:

代码语言:javascript
复制
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))";
EN

回答 3

Stack Overflow用户

发布于 2011-11-26 23:40:34

我不能为你说或调优这个查询。但我建议您通过查看explain计划来构造最终查询。explain计划将告诉您是否正在使用索引,您正在进行多少行扫描,也许您可以从那里开始。用来解释一个查询

代码语言:javascript
复制
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仍然要好得多,特别是当您处理大量记录和复杂查询时。

票数 1
EN

Stack Overflow用户

发布于 2011-11-26 23:43:31

避免从头开始构建字符串。使用准备好的语句、存储过程,并向数据库中添加索引。

票数 0
EN

Stack Overflow用户

发布于 2011-11-26 23:46:55

如果可以避免嵌套的select查询,而使用左联接。尤其是左连接对于相邻的树模型或父子关系非常有用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8279466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档