我的生产服务器上有这个问题。应用程序堆栈是
系统部署在具有大约256 MB内存的虚拟服务器上。
真正的问题:
查询,如
select * from customer
在大约10秒内执行,但是如果执行以下查询,
select * from customer where code like '%a%'
执行上述查询后,系统进入无限期处理,最终迫使Tomcat重启!
表统计信息: - 记录数量:5000 - 主键:代码
PHP MyAdmin在大约4秒内执行相同的查询。
您认为这可能是MySQL问题吗?有任何想法调试这个。我现在正在启用详细日志,并将继续使用我的调查结果更新此问题,但我将非常感谢您的数据库洞察。
答案 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)
您是否尝试过创建自动增量主要字段,并将代码设置为单独的唯一索引。
我之前在某些环境中使用文本作为主键的问题非常缓慢。