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;则是将id和b放入sort_buffer中排序,然后回表查询,根据 id 把 a,b,c 查询出来,把结果集返回)
- 有一个叫做
- 单路排序
- 如果 select 列的数据长度没有超过
max_lenght_for_sort_data参数,则直接把所查询的列和排序列一起放入sort_buffer中进行排序,将结果返回给客户端,该过程中只需要一次查表操作,所以叫做单路排序,相比双路排序它减少了回表的动作,因此效率更高。一开始 MySQL 只有双路排序,后续优化推出了单路排序。
- 如果 select 列的数据长度没有超过
2.2. 磁盘临时文件排序
如果查询的数据超过sort_buffer,说明内存放不下了,因此需要利用磁盘文件进行外部排序,一般会使用归并排序,就是将数据分为很多份文件,单独对文件进行排序,之后再合并成一个有序的大文件。利用磁盘排序效率会更低,针对一些情况可以调大 sort_buffer_size,避免磁盘临时文件排序。
三、🤠MySQL 的存储引擎
1. MyISAM
MyISAM是基于ISAM引擎来的,支持全文索引、数据压缩、空间函数,不支持事务和行级锁,只有表级锁,它适用于OLAP场景,也就是分析类的,基本上都是读取,不会有什么写入动作的场景。MyISAM的索引也是B+树,只是不像InnoDB那种叶子节点会存储完整的数据,MyISAM的数据是独立于索引单独存储的,所以主键和非主键索引差别不大。MyISAM不支持崩溃后的安全恢复,而InnoDB有个redolog可以支持安全恢复。MyISAM写入性能差。因为锁的粒度太粗了,不支持行锁,只有表锁,所以写入的时候会对整张表加锁。不过有个并发插入的开关,开启之后当数据中间没有空洞的时候,也就是插入的新数据是从末尾插入时,读取数据时不会阻塞的。
OLAP 和 OLTP
- OLAP:主攻“分析决策”。 分析历史数据,找规律、看趋势,支持管理决策。比如分析过去几年的销售数据,决定明年重点推广哪些产品。
- OLTP:主攻“业务执行”。 确保日常交易顺利完成,一笔是一笔。比如你点外卖下单付款,OLTP系统确保订单生成、库存扣减、支付成功。
2. InnoDB(MySQL 默认引擎)
InnoDB支持事务,实现了四种标准的隔离级别,利用MVCC来支持高并发,默认的事务隔离界别为可重复读,支持行锁 + 间隙锁提供可重复读级别下防止幻读的能力,支持崩溃后的数据安全恢复。- 支持外键,不过一般互联网项目都不会用外键的,性能太差,利用业务代码来是实现约束即可。
- 由于
InnoDB使用行级锁定和支持事务,因此在并发性能方面表现较好,特别是在多个用户同时对数据库进行读写操作时。 InnoDB的主键索引成为聚簇索引,也就是数据和索引是放在一起的,这与MyISAM有所不同,并且它的辅助索引(非主键索引)只存储索引值与主键,因此当辅助索引不能覆盖查询的列时,需要通过找到的主键再去聚簇索引查询数据,这个过程称之为回表。
四、👻SQL 的执行顺序
| 执行顺序 | SQL 子句 | 说明 |
|---|---|---|
| 1 | FROM | 确定数据源,执行表连接操作 |
| 2 | JOIN | 执行连接操作,结合多张表的数据 |
| 3 | WHERE | 过滤不符合条件的行 |
| 4 | GROUP BY | 将数据按指定的列分组 |
| 5 | HAVING | 过滤分组后的数据 |
| 6 | SELECT | 选择返回的列 |
| 7 | ORDER BY | 对查询结果进行排序 |
| 8 | LIMIT | 限制查询返回的行数 |
886

被折叠的 条评论
为什么被折叠?



