1.MySQL执行SQL语句的流程?
为了解决这个问题,先来看看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索引
寄语:容易走的路,都是下坡路