Mysql 相关概念

2021/6/12 19:56:17

本文主要是介绍Mysql 相关概念,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1、一条更新语句在 MySQL 中是怎样处理的?

更新内存和redo log,MySQL 将寻找机会将 redo log 刷新到磁盘上。

2、什么是 MySQL 的脏页?

当内存数据页和磁盘数据页不一致的时候,我们称这个数据页为脏页,当内存数据页刷新到磁盘后,这个也叫做干净页。

2、MySQL什么时候会刷 redo log 的脏页到磁盘上呢?

四种情况:

  1. redo log 满了,先暂停所有更新操作,redo log 将checkpiont向前推进一段,然后刷新脏页。

    2、内存不足,当申请新的数据页的时候,剩余内存已经不够分配新的数据页了,这时就要淘汰一部分数据页,如果淘汰的是脏页,还要刷盘。

    3、MySQL自行判定空闲时间。

    4、MySQL关闭之前,刷新全部脏页。

3、MySQL5.6 以后的 online DDL原理?

在线重新构建一张新表,在这个过程中,所有写的记录都会存在一个临时的 row log 中,新表构建完成后,将 row log 写进新表。

4、Innodb 引擎 count 内部原理?

先说结论,count(字段)<count(主键 id)<count(1)≈count(*)

count(字段):最慢,查出所有行的这个字段,判断是否是 not null,如果是 not null,那么直接累加,如果字段允许为 null,还要再遍历一次取出所有部位 null的字段,然后累加。

count(主键 id):取出所有主键 id 返回给 server 层,然后累加。

count(1):取出一行,就记一个1,然后累加。

count(*):MySQL单独优化过,性能最优。

简单来说就是,你 count 后面的括号里面输入什么,innodb 引擎就给你返回什么,而所有种类中,只有 count(*) MySQL 的优化器优化过,其他都没有单独处理。

5、什么是覆盖索引?

覆盖索引就是指索引本身的数据,就可以满足查询,不需要回到主键索引上面取数据了。

6、MySQL 排序原理?

1)初始化排序的内存,确认要查询的字段。

2)根据 SQL 匹配的索引获取主键id,根据主键id去主键索引中寻找这一整条数据,得到需要的字段的值。

3)重复第二步,获取所有需要的数据在缓存中。

4)将所有列的数据在内存中执行快速排序。

5)取出 sql 中标明的数据条数。

当所需要排序的字段所占空间大于 MySQL 为每一条线程设置的阈值 sort_buffer_size 时,会采用 filesort,将基于临时文件使用归并排序对所有数据进行排序。

7、当 MySQL 单行数据过大,可能会导致 filesort,排序会导致使用临时文件进行归并排序,如果提高效率?

当单行数据总长度大于 max_length_for_sort_data 时,会将排序字段和主键放在内存中,而不是查询所需要的字段,但是这样虽然节省了内存,在排序后,还需要使用一次主键索引查询 sql 需要的数据,节省了内存。

8、如何给有排序需求的 sql 创建索引?

如果字段不是特别多的话,可以给 where 条件中的 条件和 order by 中的字段加上联合索引,这样可以走覆盖索引,减少回表次数。

9、Innodb 引擎,如果表中没有设置主键,或者是删除掉主键,是不是就无法走主键索引了?

不是,如果没有主键的话,Innodb 会自动生成一个6字节的 rowid。

10、MySQL 的隐式转换问题

当表中字段的类型是字符型,而 sql 中该字段在 where 中是数字时,会触发隐式转换,MySQL 会将表中的字段转换为数字再与其进行匹配,这些操作是不走索引的,全表扫描。

11、普通索引和唯一索引应该如何选择?

对唯一约束有要求的话,只能选唯一索引了,如果对唯一约束没有要求的话,最好还是选择普通索引,唯一约束是有成本的,对于 where xxx=“yyy” 这样的查询来说,普通索引查询到数据后,还会向后检索,而唯一索引的字段查询后会直接返回的,性能差异微乎其微。更新的情况下,普通索引字段更新效率是高于唯一索引的,普通索引更新时会更新在 change buffer 中,是一种内存中的更新缓存,这些缓存会定时和数据页合并,这个缓存也是会持久化的,,而唯一索引字段的更新,是需要去磁盘中查询的,因为需要知道更新后的字段会不会违反唯一约束,更新效率显然不如普通索引,MySQL 整体的内存命中率也会降低。

12、读写分离时,主从数据不一致的问题如何解决?

1)对于刚写入就立刻需要读的场景,可以直接走主库。

2)可以走从库,但是读之前可以sleep一下,主从数据延迟通常情况下都是1s内。

3)开启半同步复制,主库在事务提交时,给从库同步 bin log,从库返回ack,主库才给客户端返回事务完成。



这篇关于Mysql 相关概念的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程