mysql server 架构体系(了解)
连接器
使用命令查看当前mysql的连接
show processlist;
分析器
由 词法分析 和 语法分析 组成,解析sql语句,使用 antlr 和 calcite 实现
优化器
由 RBO 和 CBO 两个组件组成
- RBO : 基于规则优化
- CBO : 基于成本的优化
执行器
与对应的存储引擎进行交互.
存储引擎
主要包括 innodb 和 myisam, 不同的数据文件在不同的组织形式,mysql5.5之后默认为innodb引擎
innodb 与 myisam 的区别
innodb | myisam |
---|---|
支持事务 | 不支持 |
有外键 | 没有 |
支持行锁和表锁 | 支持表锁 |
索引存储的叶子节点的数据不同 | |
count(*)在myisam中比较快,但是不能带任何的查询条件 |
使用命令查看引擎列表
show engines;
查询缓存
在 mysql 8.0 之后取消,
索引系统
相关问题
- 索引存在文件中还是内存中?
索引是必须进行持久化存储的,除了memory这种存储引擎,所以索引是存储在文件中的
- 索引在进行数据读取的时候,需要返回什么信息?
key值 文件名称 offset
- 为什么mysql不使用这种格式?
慢
- mysql如何设计索引系统?
数据格式: k-v
数据结构: hash 树
- mysql采用什么样的数据结构?
hash B树
使用什么数据结构和存储引擎相关联,innodb使用的是B树,但本质上是B+树,同时innodb支持自适应hash
memory,myisam 存储引擎使用的是hash数据结构
- 为什么?
- 需要良好的hash算法
- hash表需要大量内存
- 不适合范围查询,不太适合大量查询的应用场景
拓展名词
OLTP | OLAP |
---|---|
联机事务处理 | 联机分析处理 |
关系型数据库 | 数据仓库 |
时效性高 | 对历史数据分析,产生决策性影响 |
局部性原理: 空间和时间,数据程序聚集存放,更改被查询过的数据有可能很快又被查询;
磁盘预读:内存跟磁盘进行交互的时候,有一个最小的逻辑单元,称为页,页一般大小为4k或者8k,而在进行数据交换的时候,也是以页为单位的,可以是页的整数倍,innodb存储引擎默认读取16kb
在B+树中有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有的叶子节点(即数据节点)之间是一种链式结构,因此可以对B+树进行两种查找运算: 一种是对于逐渐的范围查找和分页查找,另一种是从根节点开始,进行随机查找
聚簇索引和非聚簇索引?
聚簇索引: 数据和索引是放在一起的
一个表的聚簇索引一定是主键索引吗?
不一定
一个表的聚簇索引会有很多个吗?
只有一个
主键索引一定是聚簇索引吗?
创建表的时候没有主键,没有唯一键,添加数据之后,设置了主键
innodb主键聚簇,myisam非聚簇
innodb的普通列索引是非聚簇索引
索引分类
可分为聚簇索引和非聚簇索引
也可以分为以下分类:
主键索引
唯一索引
普通索引/辅助索引/二级索引
全文索引
组合索引/联合索引:索引包含多个列
一般情况下,sql语句尽可能多的带主键字段,方便进行查询,但是主键字段的条件一定会生效吗?
不一定,可能走其他索引
普通索引 回表
select * from stu where name = ‘zhangsan’
先查询name索引的B+树 返回id值,再使用id值查询所有数据,称为回表
普通索引 索引覆盖
通过name这棵树找到要查询的所有字段,可以直接返回,不需要从主键树中检索结果,此时叫索引覆盖,sql优化通常可以选择索引覆盖
组合索引 最左匹配
每次匹配从第一个列开始匹配,当表中的所有列都是索引列时,不符合
组合索引 索引下推
多个条件查询时,根据条件从存储引擎中数据筛选,然后选出对应的结果
索引失效
在组合索引中sql语句使用 大于 或者小于 会阻挡后边的索引
模糊查询时,不能以%开头
id + 1 = 3;索引id列不能使用表达式
隐式转换 ,比如 phone = 13548时,底层会类型自动转换,应当使用phone = ‘13548’