Skip to main content

查询过程

Server层

  • 连接器

    • 负责跟客户端建立连接、获取权限、维持和管理连接
    • 连接方式
      • TCP/IP
      • 命名管道和共享内存
      • UNIX域套接字
    • 建立连接:后续权限变更不会影响该连接
    • 有限制的连接数
    • 每个连接占用一个线程
    • 断开连接会缓存线程
    • 超时,wait_timeout(默认8小时),连接器会主动断开
    • show processlist:查看当前连接
      • Command列显示为“Sleep”为空闲状态,超时会断开,参数wait_timeout控制

    注意:尽量减少建立连接的动作

  • 查询缓存,不推荐,8.0废弃

  • 分析器

    解析SQL语句

    • 词法分析,分词,识别关键词
    • 语法分析,分词后的组合是否符合规则
  • 优化器

    • 决定使用哪个索引
    • 有多表关联(join) 的时候,决定各个表的连接顺序
  • 执行器

    • 判断执行查询的权限
    • 打开表,使用引擎接口
    • 扫描行数,符合添加不符合下一个
    • 字段rows_examined:表示扫描的行数,这个值是在执行器每次调用引擎获取数据行的时候累加的
      • 有些时候,执行器调用一次,引擎会扫描多行,所以rows_examined与引擎扫描行数不一定相同
  • 其他

    • 所有的内置函数(如日期、时间、数学和加密函数等)
    • 所有跨存储引擎的功能,比如存储过程、触发器、视图等

存储引擎层

  • 负责数据的存储和提取。插件式的。
  • 其架构模式是插件式的,支持InnoDB、MyISAM、 Memory等多个存储引擎。
  • MySQL 5.5.5版本InnoDB开始成为了默认存储引擎(手动指定engine=memory)

文件系统

更新过程

引擎将这行新数据更新到内存中,同时将这个更新操作记录到redo log里面,此时redo log处于prepare状态。然后告知执行器执行完成了,随时可以提交事务。