• mysql原理


    一、Mysql

    1.1 事务的隔离界别

    • Read UNCOMMITTED 读未提交

    所有的事务都能看到未提交的事务的执行结果,容易出现脏读。

    • READ COMMITTED 读取提交内容
    大多数默认的事务隔离级别,但不是mysql的。一个事务从开始到提交前都是不可见的,
    但是该事务级别支持“不可重复读”,所以用户在运行同一语句两次,结果是不同的。
    
    • 1
    • 2
    • REPEATABLE READ 可重复读

    mysql默认的隔离级别,解决了读未提交导致的问题,但是会导致幻读,InnoDB和Falcon存储引擎通过多版本控制解决了幻读。

    • SERIALZABLE 可串行化

    事务隔离的最高级别,强制事务排序,解决幻读。简而言之就是在每个读的数据上锁。

    1.2 mysql的复制原理

    在这里插入图片描述

    (1) master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
    (2) slave服务器会在士定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
    (3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。

    1.3 mysql的聚簇索引和非聚簇索引

    mysql的索引类型是和存储引擎相关的,innodb存储引擎数据文件跟索引文件全部放在ibd文件中,myisam的数据文件放在myd中,索引文件放在myi文件中,区分两者索引只需要判断数据和索引是否放在一起。

    1.4 索引的的原理

    Mysql用到两种数据结构:B+Tree索引和Hash索引。
    Inodb存储引擎默认B+Tree索引。
    Memory存储引擎默认Hash引擎。查询单挑速度快,范围查找慢。
    Memory表会存储在内存,断电会消失。

    1.5 mysql的锁的类型有哪些?

    基本锁的属性被分类成共享锁(读锁)和排他锁(写锁)。
    根据锁的粒度分为行级锁(innodb)、表级锁(innodb、myisam)、页级锁(innodb)、记录锁、间隙锁、临键锁。


    共享锁:当一个事务为数据加上读锁之后,其他事务只能对该数据加读锁,不能加写锁。直到所有的读锁释放后,其他事务才能加持写锁。


    排他锁:当一个事务加上写锁、其他请求不能对数据加上任何的锁,锁释放时才能加其他锁。


    表锁:上锁锁住整个表,当下一个事务进行访问该表时候,必须等待前一个事务释放锁。特点:粒度大,加锁简单,容易冲突。


    行锁:上锁的时候锁住一行或者多行记录,其他事务访问该表,被锁住的记录不能访问。特点:加锁麻烦、不容易冲突。相比表锁支持更高的并发。


    记录锁:属于行锁的一种,只不过锁住的是某条数据,可以避免数据查询被修改出现重复读的问题,也可以避免脏读。

    页锁: 介于行级锁和表级锁中间的一种锁,表锁速度快,冲突多,行锁冲突少,速度慢,所以取了折中。


    间隙锁:属于行锁的一种,间隙锁在事务加锁锁住表记录的某个区间。当id出现空隙,会形成一个区间,左开右闭。


    临键锁:属于行锁的一种,他是innodb默认算法,临键锁会把查询到的记录锁住,同时把范围查询的内的所有间隙空间锁住,最后把相邻的空间锁住。

    1.5 mysql为什么要进行主从同步?

    • 在复杂的业务系统中,有一个sql语句需要锁表,暂时不能进行读的业务,很影响性能,需要使用主从复制,主库用来写,从库用来读。进行读写分离。
    • 做数据的热备。
    • 在业务扩展,I/O访问频率过高,需要做多库的存储,降低磁盘I/O访问的频率。

    1.6 mysql的索引有哪些?对数据库性能的影响

    • 普通索引:允许索引的数据的值重复。
    • 唯一索引:保证数据记录的唯一性。
    • 主键索引:唯一的特殊索引,在一个表里面只能定义一个主键索引,使用primary key来定义。
    • 联合索引:索引可以覆盖多个数据列。
    • 全文索引:通过创建倒排索引,可以极大提升检索效率。


      索引能够提高查询速度,在查询过程中,mysql使用优化隐藏器提高效率。
      索引会占用空间,执行删除、插入、修改比较浪费时间。

    1.6 怎么处理mysql的慢查询?

    • 开启慢查询日志,定位sql语句。
    • 分析sql,是否load了其他的额外数据。
    • 分析语句的执行计划,修改语句或修改索引,增加命中索引的次数。
    • sql语句无法优化,通过对数据进行横向或纵向切分。

    1.7 B+树

    • 二叉树->二叉搜索树(BST)->二叉平衡树(ALV)->红黑树->B树->B+树
    • BST为左节点小于父节点,右节点大于父节点;ALV对BST的极端情况进行优化,通过左旋和右旋保证二叉树平衡;红黑树对ALV进行优化,将增加和查询折中,只有最长路径为最短路径的两倍才会进行左旋或右旋。B树为有序的多叉树,存储的是一个范围的树,当这个范围大于最大的degree,就会改变树的形状。

    B树
    在这里插入图片描述每次读取一个磁盘块为16k,假如数据为1k,其他指针不占用内存,3层存储的数据为16^3。

    B+树
    在这里插入图片描述
    B+树将所有的数据存储到叶子节点中,在指针占用10字节的情况下,3层能存储1600^2*16=4000w条数据。B+树有两种查找方式,第一种从根节点进行范围查找;另一种是在叶子节点通过双向指针进行数据的遍历。

    • mysql中有n个索引,最多有一个聚簇索引。
    • 回表:先根据普通索引(普通索引的B+树中存放的数据为聚簇索引的key值),查询到聚簇索引的key值,再通过key值查找对应的数据。
    • 索引覆盖:select id,name from xx where name = "xxx"根据name查询到id,只需要查询name和id,不需要从聚簇索引查询数据。
    • 联合索引可能包含多个索引列,遵循最左匹配,sql语句最左匹配,mysql有优化器,查询条件与索引顺序不一样,会进行在这里插入图片描述
  • 相关阅读:
    Abbexa竞争性ELISA试剂盒丨Abbexa阿维菌素ELISA试剂盒
    2022年上半年软设算法题代码
    【无标题】
    聊聊Linux中CPU上下文切换
    滑动窗口内最大值和最小值的更新结构
    P9656 [ICPC2021 Macao R] So I‘ll Max Out My Constructive Algorithm Skills
    个人课设---玩家血条(包括攻击掉血,复活重生功能)
    31、Java高级特性——Math类、Random类、String类、StringBuffer类、StringBuilder类
    第二十章 多线程
    【算法】加密解密算法(DES、3DES、SM2、SM3、SM4)以及RSA加密算法
  • 原文地址:https://blog.csdn.net/qq_46624276/article/details/126241894