程序员@IT·互联网

从SQL Server到MySql(8): Mysql 的查询执

2015-11-08  本文已影响149人  沪上最强亚巴顿

1. 客户端/服务器通信协议

2. 查询缓存

3. 查询优化处理

// **************会被转换为下述的类似代码执行******************
outer_iter = iterator over t1 where...
outer_row = outer_iter.next
while outer_row
inner_iter = iterator oever t2 where ....
inner_row = inner_iter.next
while inner_row
....
inner_row = inner_iter.next
end
outer_row = outer_iter.next
end

    * 本质上, 所有类型的查询都以此类方式运行. 
    * `但全外连接是个例外, 因为它无法通过嵌套循环和回溯的方式完成. 所以Mysql 并不执行全外连接.`
      * full join :表中数据=内连接+左边缺失数据+右边缺失数据.
  * 执行计划
    * Mysql 并不会生成查询字节码来执行查询, 而是生成查询的一颗指令树, 然后通过存储引擎执行完成这颗指令数并返回结果. 
    * 最终的执行计划, 包含了重构查询的所有信息.
  * 关联查询优化器
    * 由于Mysql 嵌套循环方式的关联查询执行方式, 所以关联顺序变得非常重要.
    * 关联优化器会尝试在所有的关联顺序中选择一个成本最小的执行.
      * 但是, 当管理表过多时, 只能使用"贪婪" 搜索方式查找最优值.
      * 当10个表进行关联时,. 一共有3628800种不同的关联顺序.
  * 排序优化
    * 当无法使用索引进行排序时, Mysql 需要进行排序, 成为文件排序(可能在内存,硬盘中进行,根据数据量大小).
      * 内存不够时, 将数据分块, 对每个块使用"快速排序"并将结果存放在磁盘上, 最后进行merge.
    * 两种排序算法.
      * 两次传输排序(旧版本)
        * 读取行指针和需要排序的字段, 对其进行排序. 然后再更加排序结果读取所需要的数据行.
      * 单次传输排序(新版本)
        * 先读取查询需要的所有列, 然后再根据给定列进行排序, 最后直接返回排序结果.
    * `Mysql 进行文件排序时, 所需要使用的临时存储空间可能很大. 因�其对每个排序记录都会分配一个足够长的定长空间存放.`

### 4  查询执行引擎
* 经过了解析和优化阶段, 会生成执行计划(数据结构而非字节码). 查询执行引擎则根据这个执行计划来完成整个查询.
* 过程: 简单地根据执行计划给出的指令逐步执行.

### 5 返回结果给客户端
* 即使没有结果数据, 也会返回一些查询信息,如影响的行数.
* `增量, 逐步返回的过程. �开始生成第一条结果时,就逐步地进行返回.`
* 好处: 服务器无需存储太多结果. 让客户端尽快的得到了结果.
上一篇下一篇

猜你喜欢

热点阅读