Mysql随记

@

mysql使用的是“边读边发”模式。

  1. 从引擎读取数据到Server
  2. 将数据放入net_buffer中,达到net_buffer_length后写入socket send client发送给Client
  3. 此时客户端如果接受慢,会影响到查询效率

使用show processlist可以看见client的状态

  • state=Sending to Client标识正在写入net_buffer
  • state=Sending data只标识正在执行

Buffer Pool

  • 页热点数据如何存储?
    buffer pool使用的是LRU算法。但不是普通的LRU算法,因为会存在冷数据站满脸表导致缓存失效的问题。
    bufer pool使用的是改良后的LRU算法,具体如下:

    • 使用5/8称为young区域
    • 使用3/8称为old区域

    使用指针lru_old标识old区域开始的位置
    当需要产生新的Page时,淘汰old尾部Page,新Page插入lru_old位置
    innodb_old_blocks_time后页还在移动到young头部,否则不变
    保证了大表扫描期间,热数据可用。

Join

表链接,使用一张表的字段作为基准查询另一张表后组合返回
使用时应该注意小表驱动大表:where条件后数据较少的表称为小表
它的大概查询步骤是:(有表T,T1)

  • 根据条件查询出表T,根据on语句后条件在表T1中查询到数据后返回
    • index Nested-Loop Joinon语句后T1表索引命中,直接逐行取查询索引树返回

      • 为了用上MRR(随机读写转为顺序读写)加快join效率,将T表数据查处后在join_buffer中案Id排好序再根据索引去T1表取数据拼接结果集(BKA)。
      • 开启: set optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on'
        在这里插入图片描述
    • block Nested-Loop Joinon语句后T1表没有索引

    1. 取出T表数据
    2. 根据on后条件查询T1数据放入Join Buffer中,如果Join Buffer到达join_buffer_size后T1表未遍历结束,组合T和T1的结果集后清空Join buffer重新开始。
      如何针对BNL查询优化:
      使用临时表创建带索引的列,就可以转为BKA加快查询效率了。
posted @ 2021-12-15 10:52  ccme  阅读(34)  评论(0)    收藏  举报