体系结构
- 连接层:做授权认证,校验密码,校验客户端操作权限
- 连接池
- 服务层:MySQL核心功能
- SQL接口
- 跨存储引擎的实现,DML、DDL语句封装等
- 存储过程、视图、触发器
- 解析器
- 查询优化器
- 缓存
- 引擎层:控制数据存储提取的方式
- 5.5版本后默认InnoDB引擎
- 插拔式存储引擎
- 索引是在存储引擎层实现的
- 不同的引擎,索引结构不一样
- 服务器通过API和引擎交互
- 存储层:数据存储
- 日志
- redolog、undolog
- 二进制日志、错误日志、查询日志、慢查询日志
- 数据
- 索引
简单概念
- Sql连接池
- ->线程获取到流数据
- sql接口
- 监听端口获取SQL
- 解析器:
- 进行关键字解析,查询需要做什么
- 优化器:
- 选择效率优先的线路去执行
- 执行器:
- 执行SQL ,CRUD
- 存储引擎:
- mysql插拔式编程
- 可选引擎,我要做什么,可以选择更优的引擎进行替换
- 当前数据在哪,我应该怎么帮助执行器更好的执行SQL,更好的放到内存或者磁盘,对数据进行操作
SQL请求
- 当用户请求到SQL数据,SQL接口就可以从线程中监听的端口中获取到SQL语句,这时他是不知道这个语句是要做什么的,他就会将这个sql语句交给Sql解析器进行分析,当解析器通过关键字分析出来这句sql将要执行什么操作后,他会再将sql交给优化器来选择执行线路,sql优化器可以对语句字段根据数据库的索引,选择高效的执行路线交给sql执行器进行执行,,sql执行器此时就可以执行了,,执行的时候会让存储引擎帮忙,看数据在哪个地方,怎么执行,存储引擎就落盘到磁盘,
- 可以帮助分发到内存或者是磁盘,方便进行sql数据的操作
mysql索引
索引的划分可以根据不同的角度划分为不同的结构,比如数据结构,或者存储角度等。
索引结构
在mysql的innodb引擎下,他是一个B+tree的结构
- B+tree
- 简单理解为一棵普通的二叉树,和一个完整的链表,链表就是是叶子节点,树就是非叶子节点
- 通过树可以确定要找的数据在哪个范围内,然后就可以通一个个的子节点找到对应的链表位置
- 最大的特点就是可以获取多数据,避免回旋查找其它数据,
- 因为数据结构是链表,所以一但确定了某一个节点,就表示这个节点之前,或者之后的所有数据都已经拿到了,就不用再去找向上再去通过树向上找上去重新查找了,
- 所以在数据库中查找的效率很高
存储角度:
聚簇索引和非聚簇索引
- 聚簇索引:
- 主键索引 (查询效率高),每张表有会有一个默认的主键
- 通过主键索引可以找到所有的值,通过主键来查找数据效率是最高的
- 如果没有设置主键列,那么第一个非空字段,就是主键列
- 没有都没有非空主键列,那么mysql会自成生成一个隐藏的默认的主键列索引
- 非聚簇索引:
- 辅助索引,非主键索引
- 只有辅助列的值
- 如果是通过非聚簇索引来找数据的话,如果非聚簇找不到,就会去找聚簇,就称为回表
- 回表查询会降低效率,所以应该避免回表