【问题标题】:MySQL like query runs extremly slow for 5000 records table对于 5000 条记录的表,类似 MySQL 的查询运行速度极慢
【发布时间】:2010-12-28 15:26:28
【问题描述】:

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

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

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

真正的问题:

查询喜欢,

select * from customer

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

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

在执行上述查询后,系统立即进入无限期处理并最终强制 Tomcat 重启!。

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

PHP MyAdmin 执行相同的查询大约需要 4 秒。

你认为这可能是 MySQL 的问题吗?任何调试这个的想法。我现在正在启用详细日志,并将根据我的发现不断更新这个问题,但希望您能提供数据库见解。

【问题讨论】:

  • 是用粗体字写语句。可能是我使用了错误的 MarkDown 标签。让我解决这个问题
  • 我不希望 select * from customer where code like '%a%' 很快,因为它不可能使用索引。必须检查每条记录。如果可能,请考虑 select * from customer where code like 'a%',因为这可能会使用索引。
  • 256 MB 内存 - 用于整个虚拟机?!请告诉我您可以为 VM 分配更多内存...
  • 我不知道它是否适用于整个虚拟机,但大多数情况下是的。欲了解更多信息,我正在使用 eapps.com 的共享托管计划。

标签: java mysql sql tomcat6 ibatis


【解决方案1】:

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

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

我们降低了领先的百分比,并将搜索查询的时间减少了几个数量级(从服务器研磨 60 秒以上到“根本没有时间”)。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我是靠 ibatis 来获取记录的。实际上时间包括HTTP往返时间和逻辑执行时间。如果您考虑实际的数据库时间,它大约是 4 秒。让我在我的问题中编辑它。另外请让我知道我应该在 MySQL 配置中寻找什么。
    【解决方案3】:

    搜索开头的 % 导致表从不使用索引。 % 是一个通配符,因此它必须遍历数据库中的每条记录。再加上 tomcat 正在运行以及 MySQL 正在运行的事实,这使得情况变得更糟。没有太多空间可以将索引放入内存中进行读取。

    你需要增加那个盒子上的内存量,让 MySQL 创建它需要的必要内存缓存和空间,让查询快速工作。

    【讨论】:

      【解决方案4】:

      在问题中,张贴者指出,相同的查询在 PHP MyAdmin 中运行 4 秒,所以问题不在于 MySql 或由于 % 而无法使用索引,而在于 Tomcat 或数据访问层。

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 我做不到。这是一个用户输入字段。
        猜你喜欢
        • 2016-02-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多