• 20 mysql const 查询


    前言

    这里主要是 探究一下 explain $sql 中各个 type 

    诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 

    这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 

    以及 相关的差异 

     

    测试表结构信息如下 

    1. CREATE TABLE `tz_test` (
    2. `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
    3. `field1` varchar(12) DEFAULT NULL,
    4. PRIMARY KEY (`id`) USING BTREE
    5. ) ENGINE=InnoDB AUTO_INCREMENT=3333343 DEFAULT CHARSET=utf8

     

    测试数据为序列 1 – 99

    7a149e47c9ab48b894cd7508e1e49627.png

     

     

    const 查询存在的记录

    这里以主键查询来调试一下 这里的整个流程

    select * from tz_test where id = 33;

     

    这里是主键查询, 首先根据index获取所属分页, 然后在目标分页进行 pageDirectory 的二分查找 

    然后再根据用户记录 线性查找, 找到目标记录, 将 cursor 存储与 prebuilt->pcur->btr_cur->page_cur->rec

    然后 后续的迭代是基于这个 记录开始迭代的 

    8a9e7d1a117b4f66a203c728cb59f09b.png

     

    我们来看一下 ‘field33’ 记录附近的内存信息的一个剖析

    下面的tuple->fields->data 记录的是比较的条件 

    33ffedaac30647fe8c04a9a7c9c7c95b.png

     

    row_search_mvcc 流程中 ”where id = 33” 条件的比较判断 

    2b6a6be998fe4bfc96d9d293bbd69cd0.png 

    比较的流程如下, 按照字段逐个比较 

    如果有一项比较出结果, 直接返回, 如果 所有的字段均匹配上响应 0

    6c06a5ac068a4b8bb0613a772395ff0d.png

     

    int 以及 一部分类型的比较方式如下, int 的比较如下 逐字节比较

    其次使用 memcmp 比较两个字节序列 

    6ee21157044e49d190e9d477acb10847.png

     

    将 rec 复制到 mysql_rec[外部传入的 READ_RECORD 的 buf]

    af49b772ac6e4d75845f8bb072445c65.png 

    rec 和 mysql_rec 的相关 

    de535a324c2f45cd88a5fb9bb69775bc.png 

    然后 记录往后迭代, 迭代到 field34 对应的记录 7884633de9cc443a92e51195f6e2578f.png 

    然后下一次迭代, 继续进入这里的比较, 两者不相等, row_search_mvcc 执行结束 

    6cfff1865bbb491082fe70714a8a2e90.png

     

    将结果输出给客户端的地方如下 

    f0a037c07edd4c6f97d5525cb5a068a7.png 

    当前查询是一个 const 查询计划, 只会返回 0条 或者 1条 记录

    因此, 这里就直接 退出查询了, 没有查询记录的迭代 

    e3e5b950a8714093a5af4356388eb0da.png

     

     

    const 查询不存在的记录

    在 optimize 的时候, 发现没有匹配到的记录, 这里 打上了一个标记

    78ddfd94930e4146b3a04199a48500e2.png

     

    初始化的时候 const_table_map 初始化为 1

    7606f2231abc4b509090eb161dbbc09b.png 

    join_read_const_table 是根据主键条件去查询记录, 结果没有查询到 返回状态 -1

    然后 这里 found_const_table_map 一直是 0, 和后面匹配不上 

    9f0b9e56f97a4c64a641ee902d55cec9.png 

    根据 index 去获取 page, 根据 pageDirectory, record 去比较之后找到的最近的记录 

    然后 这里根据 ”where id = 33333” 比较失败, 返回 DB_RECORD_NOT_FOUND

    然后 外层对异常进行处理, 最终 join_read_const_table 拿到的状态为 -1

    最终 const_table_map 和 found_const_table_map 匹配不上, 进而标记了 zero_result_cause

    ef0ba96b9fff466eba63791ee3826e94.png 

    然后 外层执行查询的时候, 发现有 zero_result_cause, 直接仅仅响应了元数据回去 

    79471f1d56ca4e15a96a6ec8371a1716.png 

     

    完 

     

     

     

  • 相关阅读:
    又到了battle EventLoop的季节
    Pyglet综合应用|推箱子游戏地图编辑器之图片跟随鼠标
    Java学习笔记(十八)
    Open3D 二维图像读取与写入
    jenkins拉取git代码 code 128解决方案
    网络命名空间
    黑五如何大卖?TikTok三大类目已抢跑,业绩翻倍指南请查收!
    【每日一题】第一天
    哪里能找到可以学习的前端实战项目?
    2.MySQL 安装
  • 原文地址:https://blog.csdn.net/u011039332/article/details/131116400