MySQL技巧:结合相关参数 做好Limit优化

发表于:2011-3-10 09:48

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:水太深    来源:51Testing软件测试网采编

分享:

  建议三:使用SQL_calc_found_rows来提高子句的灵活性

  默认情况下,Limit子句返回用户所指定的记录行数。只要数据库已经发送了用户所需要的行数,则数据库系统会放弃剩余的查询。即上面这个学生成绩的案例中,如果用户只需要返回总分成绩排名前50的学生,则数据库只返回50条记录,然后终止查询作业。

  但是在某些特定的情况下,用户可能仍然需要继续后续的查询呢?如用户出了查询某些特定的记录,还需要知道总的记录数量,此时该如何处理?如现在用户需要知道排名前50的学生信息,同时需要知道总分在500分以上的总人数。此时单独使用Limit子句可能无法满足用户的需求,因为其只关心前面50条记录。如果要实现这个需求的话,往往需要结合SQL_calc_found_rows关键字。

  这个关键字的主要用途就是能够在查询时为数据库管理员事先准备好符合Where条件语句的记录数目。然后用户只要在随后执行一条Select Found_ROWS语句之后,就可以获得符合条件的记录总数。不过需要注意的是,使用这个关键字会带来一定的副作用。即带有这个关键字的查询语句,是无法使用数据缓存的。故在某些情况下会降低数据查询的性能。故一般情况下,这个关键字只用于Where条件语句比较复杂的情况。当然这只是一个出于性能考虑的建议,而并不是技术上的限制。即即使Where条件语句不复杂,也可以使用这个关键字,不会出现语法上的错误。只是其在性能上并不是很理想。

  建议四:与Distinct关键字共同使用时的特殊现象

  Distinct关键字主要用来过滤重复的记录。而Limit关键字则主要用来指定记录所返回的行数。如果这两个关键字共同使用时,会出现什么样的情况呢?如果从字面意思去理解,数据库会返回指定的不重复的记录数。如Limit的参数为50,则数据库返回50条不重复的记录数。然后后续的查询就会停止。如果查询的记录中有重复记录,则数据库查询的实际数量往往要比Limit关键字所指定的数量要多。

  在实际工作中,这条语句的作用还是很大的。如现在有一张员工考勤信息的表格。现在数据库管理员需要统计缺勤次数排名前20的员工人数。此时为了防止有重复的记录,就可以在查询语句中加一个Distinct关键字,用来过滤重复的记录数。从而可以避免采用多个查询语句来完成这个需求。

  建议五:Limit与索引之间的关系

  如果数据库管理员决定使用Limit子句来指定需要显示的记录数,那么最好能够最大限度的使用索引,以避免全表扫描,提高工作效率。即当数据库选择做完整的表扫描时,可以在某些情况下使用索引。

  如现在数据库管理员决定将Limit子句与Order BY子句一起使用。数据库一旦找到了排序结果的第一个RowCount行,则系统将会结束排序,而并不会对整个表进行排序。如果单独使用Order By子句的话,则会对整个表进行排序。虽然如此,但是排序必定要浪费一定的时间。此时数据库管理员如果决定使用索引,则可以在很大程度上提高这个查询的效率。

  对于这个内容,笔者要强调一个问题。如果必须要进行文件排序,则必须选择所有匹配查询,并且在确定已经找到第一个行之前,必须对他们的大部分内容进行了排序。特别需要强调的是,在任何情况下,一旦找到了行,则就不需要再排序结果的其他部分,数据库会自动结束排序。

  可见Limit子句其本质的功能是限制用户的纪录数量。但是其还有很多别的用途。如快速判断查询语句的有效性、计算表所需要的空间等等。不过其也有一定的副作用,可能会带系统的运行带来一些负面的影响。此时最好能够采取一些措施来提高系统运行的性能。

22/2<12
2023测试行业从业人员调查问卷已开启,千元大奖正在等你~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号