我有一个 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/