mysql order by limit性能优化研究

时间:2016-06-27
musql order by不合理的使用,特别是与LIMIT在一起不合理的使用,往往是导致MySQL的性能下的原因之一。本文章向大家介绍mysql order by limit性能优化方面的相关知识,以便大家避免这些问题。

https://www.percona.com/blog/2006/09/01/mysql-order-by-limit-performance-optimization/

MySQL的ORDER BY与LIMIT经常使用在大型数据集的交互式应用程序中进行排序。在许多网站上,比如查询最近注册用户,这些功能都需要使用到ORDER BY与limit。一般这种类型的ORDER BY的语句是这样的:

SELECT ….. WHERE [conditions] ORDER BY [sort] LIMIT N,M

当SQL里面有ORDER BY LIMIT的时候请确保查询中使用到索引,因为有了索引,ORDER BY LIMIT不会扫描和排序整个结果集。 比如下面sql查询语句:

SELECT * FROM sites ORDER BY date_created DESC LIMIT 10;

如果我们在date_created上使用索引,查询将会变得很快。

再比如我们有这样一个SQL查询语句:

SELECT * FROM sites WHERE category_id=5 ORDER BY date_created DESC LIMIT 10;

在date_created字段上创建索引将会提高执行效率,但是这不是最高效的方法,我们可以为date_created和category_id创建联合索引,执行效率会更高。

我们将上面的SQL稍微改变一下:

SELECT * FROM sites WHERE category_id in (5,10,12) ORDER BY date_created DESC LIMIT 10;

看起来和上面的SQL语句没有实质性的改动,但是他们的查询效率还是有很多的差别,因为现在有多个category_id并且我们使用了in语句,所以联合索引date_created和category_id不管用了,但是单独的date_created索引还是能正常工作的。