问题的出现是这样的,我的一个web应用中有一个列表页面,遇到了n+1问题,就是打开这个页面,列表中有n条信息,就会产生n+1条sql。打开这个页面很慢,需要1分钟多。然而,这个问题只在测试环境出现,生产环境和本地开发环境均为出现此问题。
经过跟踪和分析,发现问题出在获取连接的时候,由于没有使用连接池,这n+1条sql,经常就会遇到获取连接慢的。如下为日志:
2009-11-23 13:41:20,679 INFO [Test] - -----------config------------
2009-11-23 13:41:20,695 INFO [Test] - url: jdbc:mysql://88.88.88.88:3306/xxxdatabase?useUnicode=true&characterEncoding=UTF-8
2009-11-23 13:41:20,695 INFO [Test] - BEGIN: select * from xxxtable where id = 1
2009-11-23 13:41:21,476 INFO [Test] - END: 765|16
2009-11-23 13:41:21,476 INFO [Test] - BEGIN: select * from xxxtable where id = 2
2009-11-23 13:41:21,523 INFO [Test] - END: 47|0
2009-11-23 13:41:21,523 INFO [Test] - BEGIN: select * from xxxtable where id = 3
2009-11-23 13:41:21,585 INFO [Test] - END: 62|0
2009-11-23 13:41:21,585 INFO [Test] - BEGIN: select * from xxxtable where id = 4
2009-11-23 13:41:21,617 INFO [Test] - END: 32|0
2009-11-23 13:41:21,617 INFO [Test] - BEGIN: select * from xxxtable where id = 5
2009-11-23 13:41:21,663 INFO [Test] - END: 31|15
2009-11-23 13:41:21,663 INFO [Test] - BEGIN: select * from xxxtable where id = 6
2009-11-23 13:41:21,679 INFO [Test] - END: 16|0
2009-11-23 13:41:21,679 INFO [Test] - BEGIN: select * from xxxtable where id = 7
2009-11-23 13:41:21,710 INFO [Test] - END: 16|15
2009-11-23 13:41:21,710 INFO [Test] - BEGIN: select * from xxxtable where id = 8
2009-11-23 13:41:21,742 INFO [Test] - END: 32|0
2009-11-23 13:41:21,742 INFO [Test] - BEGIN: select * from xxxtable where id = 9
2009-11-23 13:41:21,757 INFO [Test] - END: 15|0
2009-11-23 13:41:21,757 INFO [Test] - BEGIN: select * from xxxtable where id = 10
2009-11-23 13:41:21,773 INFO [Test] - END: 16|0
2009-11-23 13:41:21,773 INFO [Test] - BEGIN: select * from xxxtable where id = 11
2009-11-23 13:41:21,788 INFO [Test] - END: 15|0
2009-11-23 13:41:21,788 INFO [Test] - BEGIN: select * from xxxtable where id = 12
2009-11-23 13:41:26,819 INFO [Test] - END: 5031|0
2009-11-23 13:41:26,819 INFO [Test] - BEGIN: select * from xxxtable where id = 13
2009-11-23 13:41:26,850 INFO [Test] - END: 31|0
2009-11-23 13:41:26,850 INFO [Test] - BEGIN: select * from xxxtable where id = 14
2009-11-23 13:41:26,850 INFO [Test] - END: 0|0
2009-11-23 13:41:26,850 INFO [Test] - BEGIN: select * from xxxtable where id = 15
2009-11-23 13:41:26,960 INFO [Test] - END: 110|0
2009-11-23 13:41:26,960 INFO [Test] - BEGIN: select * from xxxtable where id = 16
2009-11-23 13:41:26,991 INFO [Test] - END: 15|16
2009-11-23 13:41:26,991 INFO [Test] - BEGIN: select * from xxxtable where id = 17
2009-11-23 13:41:27,022 INFO [Test] - END: 16|15
2009-11-23 13:41:27,022 INFO [Test] - BEGIN: select * from xxxtable where id = 18
2009-11-23 13:41:27,038 INFO [Test] - END: 0|16
2009-11-23 13:41:27,038 INFO [Test] - BEGIN: select * from xxxtable where id = 19
2009-11-23 13:41:32,069 INFO [Test] - END: 5015|0
2009-11-23 13:41:32,069 INFO [Test] - BEGIN: select * from xxxtable where id = 20
2009-11-23 13:41:32,100 INFO [Test] - END: 0|31
2009-11-23 13:41:32,100 INFO [Test] - BEGIN: select * from xxxtable where id = 21
2009-11-23 13:41:32,100 INFO [Test] - END: 0|0
2009-11-23 13:41:32,100 INFO [Test] - BEGIN: select * from xxxtable where id = 22
2009-11-23 13:41:32,116 INFO [Test] - END: 16|0
2009-11-23 13:41:32,116 INFO [Test] - BEGIN: select * from xxxtable where id = 23
2009-11-23 13:41:32,131 INFO [Test] - END: 15|0
2009-11-23 13:41:32,131 INFO [Test] - BEGIN: select * from xxxtable where id = 24
2009-11-23 13:41:32,147 INFO [Test] - END: 16|0
2009-11-23 13:41:32,147 INFO [Test] - BEGIN: select * from xxxtable where id = 25
2009-11-23 13:41:32,163 INFO [Test] - END: 16|0
日志说明:BEGIN是要执行的sql,END中第一个数字是获取连接所消耗的时间,第二个数字是执行sql所消耗的时间。
请注意上面标红的sql,和别的不同,它们获取连接的时候特别的慢,平均需要5秒。这就是页面打开慢的原因。
通过百度和google,对此问题进行搜索,但是没有找到相关材料。
尝试一:
在本地的hosts中添加该ip地址的域名解析,用域名访问该数据库。
失败。
尝试二:
用show status和show processlist还有top等等查看服务器的运行状态是否存在异常。
未发现异常。
尝试三:
直接用localhost访问。
成功。
准备使用的尝试四:
修改 my.cnf
[mysqld]
skip-name-resolve #Don’t resolve hostnames
重启。
总结:该问题,困扰了我3天,虽然终于解决了,
但是没有找到根本原因。只是消除了症状,
还希望明白人指点,谢谢非常。
至于一开始为什么不用localhost而用ip,是因为公司给我的那个用户只有用ip访问的权限。
分享到:
- 2009-11-23 13:58
- 浏览 1749
- 评论(0)
- 论坛回复 / 浏览 (0 / 2112)
- 查看更多
相关推荐
MySQL作为一种广泛使用的开源关系型数据库管理系统,在很多应用场景中都可能遇到性能瓶颈的问题。常见的性能瓶颈主要分为两大类:**CPU瓶颈**和**I/O瓶颈**。 - **CPU瓶颈**:通常发生在处理大量数据时,尤其是在将...
4. **硬件升级**:考虑提升磁盘性能,如使用更快的固态硬盘,或者采用更快的网络连接,以提高数据传输速度。 5. **分区与分片**:如果表数据量极大,可以考虑使用分区或分片技术,将数据分布到多个物理存储上,以...
这是因为MySQL的查询优化器在面对大量数据的分页请求时,可能选择全表扫描而不是利用索引来提高效率。这个问题在描述中的例子中得到了体现,当尝试获取数据集的远端分页时,查询速度显著降低。 1. **分页查询原理:...
总之,MySQL的学习涵盖了很多方面,从基本的SQL语法到高级的性能优化和架构设计。作为一名Java架构师,掌握这些知识不仅可以解决实际工作中的问题,也能在面试中展现出专业能力。同时,了解MySQL的分支和替代品可以...
4. **多线程**:MySQL支持多线程,可以在同一时间处理多个请求,提高并发性能。 5. **网络支持**:作为服务器,MySQL可以跨网络运行,支持TCP/IP、Unix套接字等多种通信协议。 Boost库: 1. **C++库**:Boost是一个...
3. **批处理(Batch Processing)**:当需要执行多条相似的SQL语句时,批处理可以一次性提交,减少了网络传输和数据库处理的次数,从而提高性能。Java的JDBC API提供了批处理的功能。 4. **连接协议与优化**:...
为了提升Linux系统在网络层面的性能,可以对TCP连接进行优化,尤其是在处理大量并发请求时。以下是一些常用的TCP配置项: - `net.ipv4.tcp_syncookies`:设置为1表示当SYN等待队列满了之后,内核可以发送SYN ...
- **触发器** 是当特定事件发生时自动执行的一段代码。 - **用途** 包括自动更新相关表、确保数据完整性等。 7. **如何在MySQL中管理用户权限?** - 可以使用GRANT和REVOKE语句来授予或撤销用户的权限。 8. **...
当我们每次看到 select * 的时候,都应该用怀疑的眼光审视,因为很多列可能都是不必要的,如果去取全部列,会让优化器无法完成索引覆盖扫描这类优化,但是,如果这种浪费可以简化开发,提高复用性,如果清楚这种做法...
总结来说,当遇到Django应用响应慢的问题时,应从多方面进行排查,包括但不限于Python环境、数据库连接、中间件、性能监控以及网络通信。通过深入分析和调试,最终可以找到问题的症结,并采取相应的优化措施。在本...
在面临跨表查询效率问题时,可以考虑建立适当的索引来提高查询速度,但也要注意过度使用索引可能导致插入更新操作变慢。对于大表优化,可以采用分区、分片、读写分离等策略。同时,定期分析慢查询日志有助于定位并...
- **双机热备**:采用主从复制的方式,主服务器负责读写操作,从服务器作为备份服务器,当主服务器出现问题时自动切换到从服务器。 - **负载均衡**:通过中间件如ProxySQL或MySQL Router来实现请求的分发,减轻单...
- **场景一**:在一个包含大量数据的表中(比如1000万条记录),统计某个特定用户的访问记录可能会很慢,可以通过建立一个统计表来解决这个问题,该表统计每天的访问次数。 - **场景二**:对于有每日发放数量限制...
- 负载均衡,分发请求到多个服务器。 #### 24. 请说明php中传值与传引用的区别。什么时候传值什么时候传引用? - **传值**:传递变量的副本,对副本的任何改变都不会影响原始变量。 - **传引用**:传递变量的引用...
`back_log`决定了在MySQL暂停接受新连接时,可以积压的连接请求数量。`connect_timeout`指定了服务器等待客户端完成握手的时间,过短可能会导致连接失败。`delayed_insert_timeout`和`delayed_insert_limit`控制了...
当系统接口数据处理较慢时,可以将这些数据缓存起来,从而在下一次请求时可以直接从Redis中快速读取数据。在数据存储方面,Redis的应用场景包括会话存储、消息队列系统、网站访问统计、实时系统指标、地理信息的处理...
- `equals`方法用于比较两个对象的内容是否相同,默认情况下也是比较内存地址,但很多类重写了该方法来实现内容的比较。 10. **访问权限修饰符** - `public`:公共的,可以在任何地方访问。 - `protected`:受...
在Django框架中,分页是网页应用中非常常见的需求,尤其当数据量较大时,分页能够提高用户体验,避免一次性加载过多数据导致页面响应慢。本项目"django_03_分页实现_zh.zip"是基于Django、Python和MySQL数据库实现的...
4. **数据库监控**:如MySQL的查询性能、连接数、慢查询等。 5. **错误和异常报告**:捕获并记录PHP错误和警告,帮助调试。 6. **性能分析**:分析PHP脚本的执行时间和瓶颈。 7. **自定义指标**:允许用户添加自己的...
OpenResty的`capture_multi`和`cosocket`特性,结合coroutine(协程)和socket技术,能有效地处理TCP/UDP协议的上下游连接,包括MySQL、Redis、WebSocket和DNS查询等,从而实现高效的并发查询。 面对新型攻击手段,...