我有一个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的主键。
答案 0 :(得分:1)
问题就在于此类。要获取前1000条记录,数据库只需要过滤数据库,直到找到与搜索匹配的1000条记录。对于其他查询,数据库需要匹配记录,直到它有645000条记录,这使得速度慢得多。没有排序或其他过滤,因此ID上的索引根本没有帮助。
description
上的索引会有所帮助,但如果您使用通配符开始搜索则不会,就像现在一样。
我看到两个解决方案。
第一个选项是在描述字段上添加FULLTEXT索引。它允许使用MATCH而不是LIKE来查找单词error
。我认为它会快得多,但索引也会变得更大,从长远来看,我不确定优化。
第二个解决方案:由于您显然正在寻找错误(我认为您在日志表上构建报告?),您可以添加一个记录类型的列。您可以为每条记录提供一个类型(只是一个整数),指示该记录是否存在错误。您需要更新一次表,并将该类型与新记录一起插入,但它会使您的查询更快。
我必须承认,第二种解决方案是基于对数据和目标的假设。如果我错了,请提供更多信息,我可能会找到更适合您的解决方案。