2009-12-21 97 views
2

我在生产服务器上遇到此问题。应用程序栈是,MySQL查询运行速度极快,5000条记录表

  • 的Java Web应用程序在Tomcat 6.0.18
  • iBatis的数据访问层
  • 的MySQL 5.0数据库
  • CentOS的

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

真正的问题:如果执行下面的查询

查询等,

select * from customer 

在但是10秒左右执行,

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

执行上述查询之后,所述系统进入无限期处理并最终迫使Tomcat重新启动!

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

同样的查询PHP MyAdmin围绕4秒执行。

您是否认为这可能是MySQL问题?任何想法来调试这个。我现在正在启用详细的日志,并会不断更新这个问题与我的研究结果,但会很感激你的数据分析的见解。

+0

这是写在大胆的文本语句。可能是我使用了错误的MarkDown标签。让我解决这个问题 – jatanp 2009-12-21 05:37:33

+0

我明白了。我修好了它。 – Asaph 2009-12-21 05:37:54

+3

我不希望从客户那里选择*'%a%'这样的代码要快,因为它不可能使用索引。每个记录都必须检查。如果可能的话,考虑从客户那里选择*代码如'a%',因为那样可以使用索引。 – Asaph 2009-12-21 05:39:52

回答

0

看来你的MySQL服务器安装不正确,需要10秒5000个记录不应该被接受。

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

+0

我依靠ibatis来获取记录。其实时间包括HTTP往返时间和逻辑执行时间。如果你考虑实际的分贝时间大约4秒。让我编辑我的问题。另外请让我知道我应该在MySQL配置中寻找什么。 – jatanp 2009-12-21 05:36:03

-1

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

我在使用文本时遇到了问题,因为之前在某些环境中主键速度非常慢。

+0

我不能那样做。这是一个用户输入字段。 – jatanp 2009-12-21 06:04:07

2

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

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

我们将搜索查询的前导百分比和缩短时间减少了几个数量级(从服务器磨削60秒+到“没有时间”)。

替代方法是使用全文索引或Lucene等系统进行搜索。

0

搜索开始时的百分比导致表从不使用索引。 %是通配符,所以它必须经过数据库中的每条记录。将这一点与tomcat运行以及MySQL正在运行的事实相结合使得它变得更糟。没有太多空间将索引放在内存中读取。

您需要增加该框上的内存量,以便让MySQL创建所需的内存缓存并留出足够的空间以使查询快速运行。

0

在这个问题中,发布者声明相同的查询在PHP MyAdmin中以4秒钟运行,所以问题不在MySql中,或者由于%而无法使用索引,但是在Tomcat或数据访问层中。