• 8.2.1.2 How MySQL Optimizes WHERE Clauses MySQL 优化WHERE 子句


    8.2.1.2 How MySQL Optimizes WHERE Clauses  MySQL 优化WHERE 子句
    
    本节讨论优化用于处理WHERE子句, 例子是使用SELECT 语句,但是相同的优化应用于WHERE子句在DELETE和UPDATE子句
    
    注意:
    
    因为MYSQL优化是不间断的,不是所有的MYSQL 优化都记录在这里
    
    
    你可能尝试重写你的查询让运算操作更快,同时牺牲可读。
    
    因为MySQL 做类似的优化自动的,你可以避免这类工作,让查询在一个更加容易懂的和维护的形式。
    
    MYSQL遵循一些优化:
    
    去除不必要的圆括号:
    
      ((a AND b) AND c OR (((a AND b) AND (c AND d))))
    -> (a AND b AND c) OR (a AND b AND c AND d)
    
    Constant folding:
     (a<b AND b=c) AND a=5
    -> b>5 AND b=c AND a=5
    
    
    恒定条件去除(需要的,因为不断折叠)
    
     (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
    -> B=5 OR B=6
    
    
    
    索引使用的常量表达式只被评估一次
    
    
    COUNT(*) 在一个简单的表没有一个WHERE 是直接检索从表信息对于MyISAM and MEMORY tables. 
    
    这个也用于对于任何NOT NULL 表达式当只用于一个表
    
    早期检测到的无效的常量表达式,MySQL 快速的检测一些查询语句是不可能的没有记录返回
    
    
    HAVING 是合并WHERE 如果你不使用GROUP BY 或者聚合函数count(),min()
    
    
    对于每个表在一个关联, 一个简单的WHERE 是被构建来得到一个快速的WHERE 评估对于表
    
    也尽快的跳过记录
    
    
    所有的常量表是首先读取 在任何其他表之前在查询里,一个常量表是下面的任何一个:
    
    1.一个空表或者一个表只有一条记录
    
    2.一个表 用于WHERE 子句在一个主键或者一个唯一键, 所有的index部分是和常量表达式比较,定义为NOT NULL
    
    
    下面所有的表是用于作为常量表:
    
    SELECT * FROM t WHERE primary_key=1;
    
    SELECT * FROM t1,t2
      WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
    
    最好的关联组合用于表关联是通过尝试所有的可能找到的, 如果所有的列在ORDER BY 和GROUP BY 子句来自同一个表,
    
    那个表是首选的当关联时
    
    
    如果有一个ORDER BY 子句和一个不同的GROUP BY 子句,或者如果ORDER BY 或者GROUP BY 包含列来自多个表在关联,
    
    
    会创建一个临时表
    
    
    如果你使用SQL_SMALL_RESULT选项,MySQL 使用一个内存临时表
    
    
    每个表索引是查询的, 最好的索引是被使用除非优化器相信 使用表扫描更加有效。
    
    一次扫描被使用基于是否最好的索引跨越了多余30%的表数据,
    
    但是一个固定的百分比不会决定选择在使用索引和表扫描。
    
    
    优化现在是更加复杂的基于它的评估额外的因素比如表大小,行的记录数,I/O块大小
    
    有些情况下, MySQL 可以读取记录从索引而不需要访问表数据文件。
    
    如果所有的列被使用从索引是数值的,只有索引树被使用来解决查询
    
    在每行输出之前, 那些不匹配HAVING 子句的会被跳过
    

  • 相关阅读:
    [Swift通天遁地]五、高级扩展-(2)扩展集合类型
    [Swift通天遁地]五、高级扩展-(1)快速检测设备属性:版本、类型、屏幕尺寸
    [Swift]LeetCode266.回文全排列 $ Palindrome Permutation
    [Swift]LeetCode265.粉刷房子 II $ Paint House II
    [Swift]LeetCode264.丑数 II | Ugly Number II
    [Swift通天遁地]四、网络和线程-(15)程序内购功能
    [Swift通天遁地]四、网络和线程-(14)创建一个Socket服务端
    hdu 4888 Redraw Beautiful Drawings(最大流,判环)
    【剑指offer】斐波那契序列与跳台阶
    Asp.NET之对象学习
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/6199155.html
Copyright © 2020-2023  润新知