2011-10-19 47 views
0

我有一个Java应用程序,我想从表中获取一些数据并显示在应用程序中。当限制去到最后记录mysql查询速度慢

我有数以百万计的记录,并且当我正在查看最后的记录时,查询变得非常慢。获得结果需要几分钟的时间。

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

可能的重复[为什么MYSQL更高的LIMIT偏移减慢查询速度?](http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-下) –

回答

1

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

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

我看到两个解决方案。

第一个选项是在说明字段中添加一个FULLTEXT索引。它允许使用MATCH而不是LIKE查找单词error。我认为它会快很多,但索引也会变得更大,并且我不确定长期的优化。

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

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