Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对于5000条记录表,类似MySQL的查询运行速度非常慢_Java_Mysql_Sql_Tomcat6_Ibatis - Fatal编程技术网

Java 对于5000条记录表,类似MySQL的查询运行速度非常慢

Java 对于5000条记录表,类似MySQL的查询运行速度非常慢,java,mysql,sql,tomcat6,ibatis,Java,Mysql,Sql,Tomcat6,Ibatis,我在我们的生产服务器上遇到了这个问题。应用程序堆栈是 Tomcat 6.0.18上的Java Web应用程序 iBatis数据访问层 MySQL 5.0数据库 森托斯 该系统部署在具有大约256 MB内存的虚拟服务器上 真正的问题: 问题是 select * from customer 在大约10秒钟内执行,但是如果执行以下查询 select * from customer where code like '%a%' 执行上述查询之后,系统立即进入无限期处理,并最终强制Tomcat重新启

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

  • 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的问题吗?有没有调试这个的想法。我现在正在启用详细的日志,并将根据我的发现不断更新此问题,但非常感谢您的db insights。

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


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

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


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

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

如上所述,问题在于文本字段上的通配符搜索,尤其是搜索中的前导%

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


另一种方法是使用全文索引或类似Lucene的系统进行搜索。

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


您需要增加该框上的内存量,以便MySQL创建所需的内存缓存,并留出空间让查询快速工作

在问题中,海报指出,在PHP MyAdmin中,相同的查询只需4秒钟就可以运行,因此问题不在于MySql或由于%而无法使用索引,而在于Tomcat或数据访问层。

我依靠ibatis获取记录。实际上,时间包括HTTP往返时间和逻辑执行时间。如果你考虑实际的数据库时间,大约是4秒。让我在我的问题中编辑一下。另外,请让我知道我应该在MySQL配置中寻找什么。它是用粗体文本编写语句。可能是我用错了降价标签。让我来修正一下,我不希望
select*from customer像“%a%”这样的代码会很快,因为它不可能使用索引。必须检查每一项记录。如果可能的话,从客户那里选择代码> >选择>,如果可能的话,因为这可以为整个VM使用一个索引.256MB的RAM!!请告诉我,你可以为虚拟机分配更多的内存…我不知道它是否适用于整个虚拟机,但大多数情况下是的。关于更多信息,我正在使用eapps.com的共享托管计划。我不能这样做。这是一个用户输入字段。