当限制到达最后一条记录时,mysql查询变慢

标签 mysql performance limit

我有一个 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的主键。

最佳答案

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

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

我看到两种解决方案。

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

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

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

关于当限制到达最后一条记录时,mysql查询变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826066/

相关文章:

mysql - 如何根据mysql中 'a'的值设置 'b'的值

mysql - Ruby gem 加载失败 - 无法加载驱动程序 'MySQL'

mysql - 大型 MYSQL 数据库的问题

php - 如何在 PHP/MYSQL 中限制条件结果查询?

ios - 如何在最新的 iOS 6 中将 map 区域限制在一个国家?

超出 Java GC 开销限制。大量的 HashMap 和优先级队列。我能做些什么?

mysql - 升级 1.6.0 到 1.7.0 后 WSO2 AM 错误

mysql - 将子查询中带有 LIMIT 的 SQL 查询转换为 Hibernate

android - 确定和防止 Android 调度延迟

performance - 'Students and Lockers' 问题的最佳解决方案是什么?