Java面试题总结(三)& MySQL


在这里插入图片描述

一、🚀Change Buffer

1. 概念

  Change Buffer 是 MySQL 存储引擎 InnoDB 的一种机制,用于暂存二级索引的更新和插入操作的变更,而不立即执行这些操作,InnoDB 会在合适的条件下(页被读取或 flush 操作)将这些变更写入二级索引当中,从而大大提高了二级索引的效率。

2. 作用

  • 提升写入性能:通过暂存二级索引的变更,可以减少对磁盘的频繁写入,从而提升插入和更新操作的性能。
  • 批量处理change buffer 可以在后续的操作中批量处理这些变更,减少了随机写入的开销。

二、🛡️MySQL 的数据排序是怎么实现的?

1. 概念

  1. 排序过程中,如果命中索引,则按照索引进行排序,否则按照文件排序。

  2. 在文件排序中,如果数据量小则在内存中排序,具体是使用单路排序或者双路排序。

  3. 如果数据量大则利用磁盘文件进行外部排序,一般使用归并排序。

2. filesort

  当使用 explain 分析 SQL 发现执行计划的 extra 中包含 using filesort 的时候,说明它无法发应用索引的顺序,而主动排序了。如果需要排序的数据比较少,则直接在内存中通过 sort_buffer 就排序了。具体是通过 sort_buffer_size 参数来控制 sort_buffer 的大小,如果需要排序的数据量小于 sort_buffer 则直接在内存中排序,反之需要利用磁盘临时文件排序,性能就比较差了。

2.1. 内存排序
  • 双路排序
    • 有一个叫做 max_lenght_for_sort_data 参数,默认是 4096 字节,如 select 列的数据长度超过该参数,则需要把 row_id(有主键就是主键)+ 排序字段放在 sort_buffer 中排序,然后回表查询,根据id把其他列字段信息查出来,将结果返回给客户端,这个过程中因为要回表查询,所以总共查询了两次,所以叫双路排序。(例如 select a,b,c from t1 order by b; 则是将 idb 放入sort_buffer 中排序,然后回表查询,根据 id 把 a,b,c 查询出来,把结果集返回)
  • 单路排序
    • 如果 select 列的数据长度没有超过 max_lenght_for_sort_data 参数,则直接把所查询的列和排序列一起放入 sort_buffer 中进行排序,将结果返回给客户端,该过程中只需要一次查表操作,所以叫做单路排序,相比双路排序它减少了回表的动作,因此效率更高。一开始 MySQL 只有双路排序,后续优化推出了单路排序。
2.2. 磁盘临时文件排序

  如果查询的数据超过sort_buffer,说明内存放不下了,因此需要利用磁盘文件进行外部排序,一般会使用归并排序,就是将数据分为很多份文件,单独对文件进行排序,之后再合并成一个有序的大文件。利用磁盘排序效率会更低,针对一些情况可以调大 sort_buffer_size,避免磁盘临时文件排序。

三、🤠MySQL 的存储引擎

1. MyISAM

  1. MyISAM 是基于 ISAM 引擎来的,支持全文索引、数据压缩、空间函数,不支持事务和行级锁,只有表级锁,它适用于 OLAP 场景,也就是分析类的,基本上都是读取,不会有什么写入动作的场景。
  2. MyISAM 的索引也是 B+ 树,只是不像 InnoDB 那种叶子节点会存储完整的数据,MyISAM 的数据是独立于索引单独存储的,所以主键和非主键索引差别不大。
  3. MyISAM 不支持崩溃后的安全恢复,而 InnoDB 有个 redolog 可以支持安全恢复。
  4. MyISAM 写入性能差。因为锁的粒度太粗了,不支持行锁,只有表锁,所以写入的时候会对整张表加锁。不过有个并发插入的开关,开启之后当数据中间没有空洞的时候,也就是插入的新数据是从末尾插入时,读取数据时不会阻塞的。

OLAP 和 OLTP

  • OLAP:主攻“分析决策”。 分析历史数据,找规律、看趋势,支持管理决策。比如分析过去几年的销售数据,决定明年重点推广哪些产品。
  • OLTP:主攻“业务执行”。 确保日常交易顺利完成,一笔是一笔。比如你点外卖下单付款,OLTP系统确保订单生成、库存扣减、支付成功。

2. InnoDB(MySQL 默认引擎)

  1. InnoDB 支持事务,实现了四种标准的隔离级别,利用 MVCC 来支持高并发,默认的事务隔离界别为可重复读,支持行锁 + 间隙锁提供可重复读级别下防止幻读的能力,支持崩溃后的数据安全恢复。
  2. 支持外键,不过一般互联网项目都不会用外键的,性能太差,利用业务代码来是实现约束即可。
  3. 由于InnoDB 使用行级锁定和支持事务,因此在并发性能方面表现较好,特别是在多个用户同时对数据库进行读写操作时。
  4. InnoDB 的主键索引成为聚簇索引,也就是数据和索引是放在一起的,这与 MyISAM 有所不同,并且它的辅助索引(非主键索引)只存储索引值与主键,因此当辅助索引不能覆盖查询的列时,需要通过找到的主键再去聚簇索引查询数据,这个过程称之为回表。

四、👻SQL 的执行顺序

执行顺序SQL 子句说明
1FROM确定数据源,执行表连接操作
2JOIN执行连接操作,结合多张表的数据
3WHERE过滤不符合条件的行
4GROUP BY将数据按指定的列分组
5HAVING过滤分组后的数据
6SELECT选择返回的列
7ORDER BY对查询结果进行排序
8LIMIT限制查询返回的行数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JAVA开发区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值