【问题标题】:mysql query slow when limit goes to last records当限制进入最后一条记录时,mysql查询很慢
【发布时间】:2011-10-19 18:17:39
【问题描述】:

我有一个 java 应用程序,我想从表中获取一些数据并显示在应用程序中。

我有数百万条记录,当我要查看最后一条记录时,查询变得非常慢。获得结果需要几分钟的时间。

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 0, 1000

上面的查询返回一个快速的结果。那是第一页快速返回。但是当我移动最后一页时,它变得很慢。

select Id from Table1x where description like '%error%' and Id between 0 and 1329999 limit 644000, 1000. 

这个查询很慢,需要 17 秒。

关于如何使这更快的任何想法? id 是 table1x 的主键。

【问题讨论】:

标签: mysql performance limit


【解决方案1】:

问题出在类似的地方。要获取前 1000 条记录,数据库只需要过滤数据库,直到找到与搜索匹配的 1000 条记录。对于另一个查询,数据库需要匹配记录,直到它有 645000 条记录,这使得它的速度要慢得多。没有排序或其他过滤,所以 ID 上的索引根本没有帮助。

description 上的索引会有所帮助,但如果您像现在这样使用通配符开始搜索,则不会。

我看到了两种解决方案。

第一个选项是在描述字段上添加 FULLTEXT 索引。它允许使用 MATCH 而不是 LIKE 来查找单词 error。我认为它会快很多,但索引也会变大,从长远来看我不确定优化。

第二种解决方案:由于您显然是在寻找错误(我认为您是在日志表上构建报告?),您可以添加一个具有记录类型的列。您可以为每条记录指定一个类型(只是一个整数),该类型指示该记录在哪里存在错误。您将需要更新您的表一次,并将类型与新记录一起插入,但这会使您的查询更快。

我必须承认,第二种解决方案是基于对数据和您的目标的假设。如果我对此有误,请提供更多信息,我可能会找到更适合您的解决方案。

【讨论】:

    猜你喜欢
    • 2014-07-05
    • 2021-07-20
    • 2012-09-17
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多