2

我在我们的生产服务器上有这个问题。应用程序堆栈是,

  • Tomcat 6.0.18 上的 Java Web 应用程序
  • iBatis 数据访问层
  • MySQL 5.0 数据库
  • 中央操作系统

该系统部署在具有大约 256 MB 内存的虚拟服务器上。

真正的问题:

像这样的查询,

select * from customer

在大约 10 秒内执行,但是如果执行以下查询,

select * from customer where code like '%a%'

执行上述查询后,系统立即进入无限期处理并最终强制 Tomcat 重新启动!。

表统计: - 记录数:5000 - 主键:代码

相同的查询 PHP MyAdmin 在大约 4 秒内执行。

你认为这可能是 MySQL 的问题吗?任何调试这个的想法。我现在正在启用详细日志,并将根据我的发现不断更新这个问题,但希望您能获得您的数据库见解。

4

5 回答 5

2

我最近在我的一个生产系统中遇到了与 MySQL 类似的问题。

正如上面提到的评论者,问题是文本字段上的通配符搜索,特别是搜索中的前导 %。

我们降低了领先的百分比,并将搜索查询的时间减少了几个数量级(从服务器研磨 60 秒以上到“根本没有时间”)。

替代方法是使用全文索引或像 Lucene 这样的系统进行搜索。

于 2009-12-21T06:02:36.467 回答
0

搜索开头的 % 导致表从不使用索引。% 是一个通配符,因此它必须遍历数据库中的每条记录。再加上 tomcat 正在运行以及 MySQL 正在运行的事实,这使得情况变得更糟。没有太多空间可以将索引放入内存中进行读取。

你需要增加那个盒子上的内存量,让 MySQL 创建它需要的必要内存缓存和空间,让查询快速工作。

于 2009-12-24T16:59:26.357 回答
0

在问题中,张贴者指出,相同的查询在 PHP MyAdmin 中运行 4 秒,所以问题不在于 MySql 或由于 % 而无法使用索引,而在于 Tomcat 或数据访问层。

于 2009-12-24T17:45:03.113 回答
0

看来您的 MySQL 服务器设置不正确,5000 条记录花费 10 秒是不可接受的。

您如何通过 java 代码访问您的数据库?在这种情况下,请在此处给出您的高级逻辑,也许您没有有效地重用数据库处理程序。

于 2009-12-21T05:28:05.227 回答
-1

您是否尝试过创建自动增量主字段,并使代码成为单独的唯一索引。

我之前在某些环境中遇到过将文本作为主键非常慢的问题。

于 2009-12-21T05:42:43.023 回答