聊聊优化sql中order By语句的方法

文 / @WordPress主题

优化SQL中OrderBy语句的方法

在使用数据库进行数据查询时,难免会遇到基于某些字段对查询的结果集进行排序的需求。在SQL中通常使用OrderBy语句来实现。将需要排序的字段放到该关键词后,如果有多个字段的话,就用","分割。使用OrderBy可以很方便地实现日常的排序操作。但是,使用的多了,我们会发现有时候SQL执行效率非常慢,有时候却比较快,这是为什么呢?本文将从MySQL数据库优化的角度来探讨OrderBy语句的优化方法。

全字段排序和RowId排序

MySQL中OrderBy的实现方式有两种:全字段排序和RowId排序。

全字段排序首先会根据查询条件确定需要排序的数据集,也就是符合条件的记录,然后将所有需要输出的字段全部放到sort_buffer中,最后对这些数据按照指定的字段排序。但这种实现方式可能会在排序数据量很大的时候出现基于文件的外部排序,导致执行效率下降。

为了避免基于文件的外部排序,MySQL提供了RowId排序的实现方式。RowId排序只会将需要排序的字段和主键Id放到Sort_buffer中,减少了存放在Sort_buffer中的数据量,降低了基于文件的外部排序的可能性。

优化OrderBy操作

为了避免OrderBy操作的影响,我们可以在索引上进行优化,以减少内容排序的数据量。

创建适当的索引:如果需要排序的列不存在索引,MySQL就需要扫描整个表,这无疑会降低SQL执行效率,所以我们需要在需要排序的列上创建索引。

使用联合索引:如果查询中有多个字段参与排序,那么如果可以创建联合索引,就能够极大的提高OrderBy操作的效率。

使用覆盖索引:如果需要排序的列的数据类型可被存储在索引树上,则可以使用覆盖索引来避免回表操作,极大的提高orderBy操作的效率。

减少排序内容:尽量只排序需要的数据,减少扫描数据量,尽量避免内容排序,这样可以极大地提高SQL执行效率。

避免使用ORDER BY RAND():Rand()函数每次生成的随机数都是不同的,所以OrderByRand()排序操作非常消耗性能,如果需要在SQL中使用随机操作,可以采用其他实现方式,比如limit rand()*count(*)。

减少sort_buffer容量:如果sort_buffer的大小无法容纳排序数据,MySQL就会执行基于文件的外部排序,从而导致SQL执行效率低下。因此,可以通过减少sort_buffer容量的方式来进行优

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。