`
bbenguo
  • 浏览: 10871 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

mysql的嵌套查询效率很低

阅读更多
开发一个小应用,用户可以提出问题,等待其他人来回答,进而可以互相交流,用户也能一定概率收到别人提出都问题。mysql数据库设计时将提出的问题和回答消息都放在了一张表格里(比较失败),在程序中需要查询当前未读消息和问题,使用了嵌套查询语句进行查询。刚开始时没有问题,但是过了大概1个月左右,应用变得非常慢,以为是数据库表格数据太大,通过查询,表格才4000多数据,于是通过日志进行了分析。


Processing FloaterController#get_params (for 112.95.145.186 at 2011-04-14 17:12:50) [GET]
  Session ID: BAh7CToOcmV0dXJuX3RvMDoMY3NyZl9pZCIlNTZiZTFkNWQyMmFhODI5NTU5
MTY1YmZhYWU4MWY1OTEiCmZsYXNoSUM6J0FjdGlvbkNvbnRyb2xsZXI6OkZs
YXNoOjpGbGFzaEhhc2h7AAY6CkB1c2VkewA6DHVzZXJfaWRpAln3--76893a47ec732df5617b5d1d70215e0b5b6df515
  Parameters: {"action"=>"get_params", "controller"=>"floater", "isGetMessage"=>"1"}
Completed in 24.57103 (0 reqs/sec) | Rendering: 0.00021 (0%) | DB: 24.55177 (99%) | 200 OK [http://www.baicao.cc/floater/get_params?isGetMessage=1]

这个查询居然要24.57秒,于是把数据库导入本地进行debug日志分析,发现是下面两条数据库语句执行非常耗时
mysql> SELECT count(*) AS count_all FROM `floater_messages` WHERE ((owner_id=42926 and reply_to_id=0) or id in(select max(id) from floater_messages where owner_id=42926 and reply_to_id > 0 group by reply_to_id));
+-----------+
| count_all |
+-----------+
|        25 |
+-----------+
1 row in set (7.39 sec)

mysql> SELECT * FROM `floater_messages` WHERE ((owner_id=42926 and reply_to_id=0 and readed=0) or id in(select max(id) from floater_messages where owner_id=42926 and reply_to_id > 0 and readed=0 group by reply_to_id)) LIMIT 10;
Empty set (9.82 sec)

对于这样的问题,可以有一下两种方法解决:

1.将嵌套语句拆开查询,多次查询的结果通过自己写程序合并。这种方法适合于出了问题以后应急,写完的代码不优雅,尤其在优雅的rails上,所以问题规避了以后,另外找时间找办法彻底解决问题。

2.如果数据关系复杂,就分几张表存储。千万不可将本来关系复杂的数据存于一张表,这样在数据量大的时候就成为效率瓶颈。


分享到:
评论

相关推荐

    mysql Join使用以及优化

    接下来,关于DBA不让使用Join的问题,其主要原因是不恰当的Join操作可能会导致查询效率极低。如果表很大或者数据没有合适索引,Join操作会消耗巨大的资源,导致性能问题。在没有索引或者索引设计不合理的情况下,...

    Mysql查询优化器.rar

    JOIN操作在大型数据库中很常见,优化器会考虑不同的JOIN策略,如嵌套循环JOIN、合并JOIN和哈希JOIN。JOIN顺序也会影响性能,优化器会尝试排列表的顺序,使得小表先被处理,以减少临时结果集的大小。 此外,查询优化...

    MySQL必知必会常识技巧实战宝典

    子查询可以在一个查询内部嵌套另一个查询,这使得我们可以构建更复杂的逻辑。虽然子查询在某些情况下可以提供更简洁的解决方案,但过多的嵌套可能会降低查询性能。因此,在使用子查询时,应该评估其对整体性能的影响...

    MySQL子查询用法实例分析

    但是,这种方法在处理大量数据时效率极低,因为每次外部查询都要对内部子查询的结果进行比较,这可能导致性能瓶颈。例如,当有80万条记录时,这种方法可能会耗费很长时间,甚至可能无法完成。 ```sql SELECT A.* ...

    oracle官方mysql性能调优优化文档

    排序操作是很多查询的一部分,特别是当涉及到GROUP BY或者ORDER BY子句时。MySQL提供了多种排序算法,如快速排序、归并排序等。 ##### 2. 优化建议 - **避免不必要的排序操作**:例如,使用适当的索引可以避免在...

    sql 强化练习工具

    两者在语法上有很多相似之处,但也存在差异,比如Oracle支持更多的SQL特性,如PL/SQL编程,而MySQL则有更快的查询速度和更低的硬件需求。 使用这个“SQL强化练习工具V1.0”,用户可以通过模拟真实场景进行实践,...

    PostgreSQL,mysql,MS SQL,Oracle性能对比.docx

    - **MySQL**:在简单的SELECT查询中表现出色,但在处理更复杂的JOIN操作时可能效率较低。 - **MSSQL**:通常具有较快的查询速度,特别是在使用索引和优化查询计划的情况下。 - **Oracle**:在处理大型数据集和...

    关系数据库中的查询优化.pptx

    - 位图索引适用于多选查询,特别是在列基数较低的情况下。 3. **考虑索引的覆盖率:** - 创建复合索引时,应尽可能覆盖查询中所需的多个列,这样可以减少额外的数据访问需求。 **索引的维护** 1. **定期重建...

    创建一个实现Disqus评论模版的MySQL模型

    一种常见的方法是使用自连接查询和连接池管理(如pgbouncer),但这可能效率较低,特别是在大数据量下。 在PostgreSQL中,递归查询是一种强大的工具,可以方便地处理树状结构。在MySQL中,我们可以通过自连接或者...

    Hibernate商业代码汇总

    如果数据库不支持`ScrollableResultSets`,则需要通过迭代`ResultSet`逐条移动,直至达到指定的起始位置,这种方式效率较低。 总的来说,Hibernate在进行分页查询时具有很高的灵活性,它会根据所连接的数据库类型和...

    行业-88 再次重温写出各种SQL语句的时候,会用什么执行计划?(1).rar

    3. **物化视图**:预计算并存储常用查询结果,提高查询效率。 4. **数据库参数调优**:根据系统资源调整数据库配置,如缓冲池大小、并行度等。 总之,理解并运用执行计划是数据库管理员和开发者的必备技能,能够...

    以一个企业网为例谈PHP网站的建立.pdf

    ...PHP的开放性和跨平台性是其受欢迎的重要原因,它可以在Windows、Linux等多种操作系统上运行,同时也支持...这种网站构建方式不仅成本较低,而且具有高度的可扩展性和维护性,对于现今的互联网环境具有很大的推广价值。

    肤浅的SQL分页代码,急需完善

    然而,这种方式的效率较低,因为OFFSET会跳过很多行,当数据量增大时,性能会显著下降。 2. ROW_NUMBER()分页: 在支持窗口函数的数据库系统中,如SQL Server,可以使用ROW_NUMBER()来实现更高效的分页: ```sql ...

    2021-2022计算机二级等级考试试题及答案No.10950.docx

    7. 软件危机:软件危机主要表现为软件开发效率低、质量难以控制和成本不断上升,选项A描述的不是软件危机特征。 8. 创建图表报表:在Access中,创建图表报表需使用图表式报表向导。 9. 电子邮件:电子邮件(E-mail)...

    基于JAVA设计的看房销售系统--完整源码.zip

    MySQL的查询速度、可靠性和适应性广受人们关注,在不需要事务化处理的情况下,MySQL是管理数据库内容最好的选择。 开发语言上,采用Java语言,可扩展性与效率都有保证。对于前端页面,采用JSP语言进行展现,JSP可以...

    2021-2022计算机二级等级考试试题及答案No.4135.docx

    结构化程序设计并不是特别关注程序的规模、执行效率或可移植性,虽然这些因素也很重要。 ### 7. 队列结构的应用场景 - **知识点概述**:队列结构在实际应用中的典型用途。 - **详细解释**:队列是一种先进先出...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...

    Oracle教程

    子查询是在一个查询语句中嵌套另一个查询语句。 - **单行子查询**: 子查询返回单行结果。 - **多行子查询**: 子查询返回多行结果。 - **比较操作符和集合操作符**: 如IN、ANY/SOME、ALL等。 #### 八、高级查询 ...

    2021-2022计算机二级等级考试试题及答案No.10067.docx

    函数的定义不能嵌套,但函数的调用可以嵌套 - C. 函数必须有返回值 - D. 不同的函数中可以使用相同名字的变量 - **正确答案**:C. 函数必须有返回值 - **知识点解析**:并非所有的函数都需要有返回值。例如,void...

Global site tag (gtag.js) - Google Analytics