当限制转到最后记录时,mysql查询速度很慢

时间:2011-10-19 18:17:39

标签: 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的主键。

1 个答案:

答案 0 :(得分:1)

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

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

我看到两个解决方案。

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

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

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