zoukankan      html  css  js  c++  java
  • mysql order by 优化 |order by 索引的应用

    在某些场景,在不做额外的排序情况下,MySQL 可以使用索引来满足 ORDER BY 子句的优化。虽然 ORDER BY并不完全精确地匹配索引,但是索引还是会被使用,只要在WHERE子句中,所有未被使用的那部分索引(一个索引多个字段的情况)以及所有ORDER BY字段都是一个常量就没问题。下面这些查询语句,使用了索引来对 ORDER BY部分进行优化:

    SELECT * FROM t1
      ORDER BY key_part1,key_part2,... ;(注意,类似key_part1、key_part2属于同一个联合索引的字段)
    
    SELECT * FROM t1
      WHERE key_part1 = constant
      ORDER BY key_part2;
    
    SELECT * FROM t1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = 1
      ORDER BY key_part1 DESC, key_part2 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 > constant
      ORDER BY key_part1 ASC;
    
    SELECT * FROM t1
      WHERE key_part1 < constant
      ORDER BY key_part1 DESC;
    
    SELECT * FROM t1
      WHERE key_part1 = constant1 AND key_part2 > constant2
      ORDER BY key_part2;

    以上查询语句的ORDER BY子句都能够使用索引进行优化排序效率。然而,在某些场景,虽然在WHERE 子句中依然可用索引去匹配的行,但并不能那么幸运的使用上索引去对ORDER BY子句进行优化。下面这些场景就是这种情况:

     这个查询语句中,ORDER BY 的字段是两个不同的单独索引:
    
    SELECT * FROM t1 ORDER BY key1, key2;
    
    这个查询语句中,ORDER BY 的字段是联合索引中两个不连续的索引字段(大家知道,联合索引是不能跳开来使用字段的,例如key(column1,column2)这个联合索引,select .. from tb where 
    或column1=... [and column2=...]都使用了索引([]内的条件可选),然而select .. from tb where column2=...是用不了索引的):
    SELECT
    * FROM t1 WHERE key2=constant ORDER BY key_part2; 这个查询语句中,ORDER BY 混合使用了降序DESC和升序ASC,也是不行的: SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
    这个查询语句中,在WHERE子句中用来检索匹配行的索引与ORDER BY使用的索引不是同一个索引,也不行:
    SELECT * FROM t1 WHERE key2=constant ORDER BY key1; 

    这个查询语句中,ORDER BY 子句使用了一个条件表达式不同于索引字段名称:
    SELECT
    * FROM t1 ORDER BY ABS(key);
    SELECT
    * FROM t1 ORDER BY -key;

    未完待续

    翻译自:

    http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html

    翻译者:http://www.cnblogs.com/langtianya/ 转载请注明出处。

    英文一般,翻译得不好的地方,多多赐教。

  • 相关阅读:
    网页加速的14条优化法则 网站开发与优化
    .NET在后置代码中输入JS提示语句(背景不会变白)
    C语言变量声明内存分配
    SQL Server Hosting Toolkit
    An established connection was aborted by the software in your host machine
    C语言程序设计 2009春季考试时间和地点
    C语言程序设计 函数递归调用示例
    让.Net 程序脱离.net framework框架运行
    C语言程序设计 答疑安排(2009春季 110周) 有变动
    软件测试技术,软件项目管理 实验时间安排 2009春季
  • 原文地址:https://www.cnblogs.com/langtianya/p/5466894.html
Copyright © 2011-2022 走看看