对于5000个记录表,MySQL像查询运行速度极慢

时间:2009-12-21 05:22:49

标签: java mysql sql tomcat6 ibatis

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

  • Tomcat 6.0.18上的Java Web App
  • iBatis数据访问层
  • MySQL 5.0数据库
  • CentOS的

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

真正的问题:

查询,如

select * from customer

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

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

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

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

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

您认为这可能是MySQL问题吗?有任何想法调试这个。我现在正在启用详细日志,并将继续使用我的调查结果更新此问题,但我将非常感谢您的数据库洞察。

5 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

您的MySQL服务器似乎设置不正确,5000条记录需要10秒才能接受。

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

答案 2 :(得分:0)

搜索开头的%会导致表永远不会使用索引。 %是通配符,因此它必须遍历数据库中的每个记录。将此与tomcat运行以及MySQL运行的事实相结合使其更糟糕。没有太多空间将索引放入内存中进行读取。

您需要增加该框上的内存量,以便MySQL创建所需的内存缓存,并允许查询快速运行。

答案 3 :(得分:0)

在问题中,海报声明相同的查询在PHP MyAdmin中运行4秒钟,因此问题不在于MySql或由于%而无法使用索引,而是在Tomcat或数据访问层中。< / p>

答案 4 :(得分:-1)

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

我之前在某些环境中使用文本作为主键的问题非常缓慢。