程序员社区

MySQL架构

1.MySQL执行SQL语句的流程?

为了解决这个问题,先来看看MySQL的结构图吧

MySQL架构插图

 

  • 连接池:提供多个客户端与服务端交互的线程。
  • SQL接口:接收SQL指令,返回查询结果。
  • 查询缓存:以key-value的方式缓存查询结果。
    • 该部分在MySQL8.0的时候去除掉了。
    • 在MySQL5.0默认开启:在配置文件中my.cnf进行配置:query_cache_type=0 //0代表关闭,1代表开启,2代表自定义。
      • 关于自定义:eg:select SQL_CACHE * from test where id=5  使用SQL_CACHE可以自定义的在sql声明使用查询缓存
    • 在MySQL8.0去除的原因:命中率太低,比如:多一个空格;执行now函数;对于更新压力大的数据库来说,经常缓存失效(更新数据后,缓存中的数据不可用)
  • 解析器:解析sql语句,生成一个"语法树"。(知道sql语句要做什么了)
    • 词法解析:解析sql语句中出现的字符串分别代表什么,比如select代表查询。
    • 语法解析:检查sql是否有语法错误,比如from写成rom等。
  • 查询优化器:一条查询可以有很多的执行方式,最后都返回相同的结果。优化器的作用就是找到其中"最好的执行计划",生成一个执行计划,交给"执行器"执行。比如是全文检索还是索引检索。
  • 可拔插存储引擎:与底层文件系统进行交互。存储引擎就是指的表的类型,接收上层传下来的命令,对表中的数据进行读写操作。

以上就是MySQL的整体架构,现在说说一条SQL语句的执行流程:

  • 连接池->SQL接口<=>查询缓存->解析器->查询优化器->执行器->存储引擎->文件系统->查询缓存->SQL接口
    • 补充:执行器:是基础服务组件中的一个,就是调用了执行引擎的api。

 

二.存储引擎

存储引擎就是指表的类型,不同的存储引擎存储表的结构不同。下面介绍几种常见的存储引擎

  • innoDB:
    • 适合写,读写分离时,常用作写库
    • 支持事务和事务的四种隔离级别
    • 主键采用聚集索引,自定义索引采用非聚簇索引。要求必须有主键,没有主键使用隐藏字段作为主键。
    • 不存储表的总行数
    • 支持表锁,行锁,并发性高
    • 底层:2个文件:xx.frm:存储表结构;xx.ibd:存储索引和数据
  • MyISAM:
    • 适合读,读写分离时,常用作读库。读的效率比innodb高,因为:只缓存索引快;维护MVCC;寻址快,MYISAM记录的直接是文件的OFFSET,Innodb先找区,再找页。
    • 不支持事务,但是每次查询都是原子性的
    • 采用非聚集索引,没有聚簇索引。
    • 存储表的总行数(对于count()这类函数,查询就比较快)
    • 只支持表锁,并发性低
    • 底层:3个文件:xx.sdi:存储表结构;xx.myd:存储数据;xx.myi:存储索引
  • Archive:
    • 用于数据存档,仅支持查询和插入,支持索引。
    • 使用zlib压缩库进行数据压缩。
  • CSV:
    • 用于数据交换机制
    • 可以将普通的csv文件可以作为MySQL的表来处理,也可以用文本编辑器或excel来读取。以逗号分割各个数据项。
  • Memory:
    • 表结构放在xx.frm文件中,数据放在内存中。访问数据非常快
    • 默认采用hash索引

 

 

寄语:容易走的路,都是下坡路

赞(0) 打赏
未经允许不得转载:IDEA激活码 » MySQL架构

一个分享Java & Python知识的社区