繁体   English   中英

MySQL之类的查询对于5000条记录表的运行极其缓慢

[英]MySQL like query runs extremly slow for 5000 records table

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

  • 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问题吗? 任何想法来调试它。 我现在正在启用详细的日志,并将根据我的发现继续更新此问题,但将感谢您对数据库的见解。

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

正如上面的评论者所述,问题是在文本字段上进行通配符搜索,尤其是搜索中的前导%。

我们降低了前导的%并将搜索查询所花费的时间减少了几个数量级(从服务器耗时60秒以上到“根本没有时间”)。

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

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

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

搜索开始时的%导致表从不使用索引。 %是通配符,因此它必须遍历数据库中的每个记录。 再加上tomcat和MySQL都在运行,这使情况变得更糟。 没有很多空间可以在内存中读取索引。

您需要在该框上增加内存量,以使MySQL创建所需的必要内存缓存,并为允许查询快速运行提供空间。

在问题中,发帖人指出,同一查询在PHP MyAdmin中将在4秒钟内运行,因此问题不在于MySql或由于%而导致无法使用索引,而是在Tomcat或数据访问层中。

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

以前,在某些环境中,文本作为主键的速度非常慢。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM