mysql高级实用技能

mysql实用技能

mysql数据目录

1.实用 SHOW VARIABLES LIKE'datadir'; 查看数据库文件存储位置

2.在目录下面,每个数据库有独立的文件夹,里面存储了该数据库表的结构定义和索引数据信息

mysql存储的大概原理

1.数据是存储在表空间里面的, 数据本身就是索引, 所以数据存储是看索引的存储(表空间文件 表名.ibd)

2每个索引的建立会产生两个段, 为了能够达到顺序IO,一个段用于存储非叶子结点,一个段用于存储叶子结点

3每个段是由区组成的,段只是一个抽象概念,区又是由页构成的的一个区是 16kb(页)*64页

4段分配单位一般是以区来分配的,因为按照页来分太散了,无法顺序IO影响读写速度

mysql执行方法(expalin 的 type)

const 一般指的是使用 唯一索引检索的时候(主键/唯一索引,null是特殊情况,null值控制不了唯一 比如写 is null,一般确认只可能检索一条记录情况)(等值查询)

ref 一般指的是二级索引,而且不是唯一索引情况,并且是等值查询(等值查询)

ref_or_null 一般是ref情况在 or 个 is null的情况 (等值查询 附加 or is null)

range 一般是指的字段不是等值查询,比如说使用 in > < like带前缀 这种进行查询(范围查询)

index 一般在联合索引情况发生, 查的字段只查联合索引上的字段,然后查询条件又没走索引,直接扫描联合索引的情况

all 直接扫描聚簇索引

注意:

1一般来说一个sql只会走一个索引,其他后面多余的where条件通过回表进行二次过滤,具体执行方法取决于被选中的那个索引

2如果出现where条件使用到多个索引字段的时候,可能会出现 index_merge, mysql执行器会计算成本

3其实使用index_merge不如使用联合索引来的快,没必要,而且性能更高

mysql Buffer pool相关

1Buffer pool是用来缓存页数据的,就是我们访问磁盘上的数据,其实是先将数据加载在Buffer pool的,然后就直接访问内存的数据.

2查看 Buffer pool的大小就是查看变量innodb_buffer_pool_size

3Buffer pool可以设置多个,更好的支持数据库的并发操作 innodb_buffer_pool_instances变量设置(总的innodb_buffer_pool_size是不变的,并且大于1G的时候多个实例才会生效)

4一个 Buffer pool可以有多个chunk, 其实我们页是加载到chunk中,可以设置innodb_buffer_pool_chunk_size大小来控制

5下面看看SHOW ENGINE INNODB STATUS\G命令关于Buffer pool的一些数据

字段 含义
Buffer pool size Buffer pool有多少页
Free buffers Buffer pool空闲页
Modified db pages 代表脏页数量,也就是flush链表中节点的数量。

Buffer poo大致原理

1首先我们读写数据其实不是直接操作磁盘的,那样会非常慢,一般读写都是在Buffer bool中的,这是块提前分配的内存

2Buffer bool为了提高并发性,其实是可以设置多个Buffer bool实例的, 每个Buffer pool实例内部又细分为多个chunk,所以真正操作是在chunk中的.

3每次读取数据先检查 chunk里面有没有,没有就从磁盘加载,然后加载到 chunk的内存里面,移除一个free 链表结点,表示某个分配的空白页面已经被使用, 如果是修改某个数据,判断是某个chunk中的数据,那么把这个页的数据同时加到flush链表中,等待刷盘.

4可能存在Buffer pool整体内存不够用,也就是chunk的内存已经使用完了,所以不可能一直缓存所有查询过的页数据在chunk中,需要是用淘汰机制,将不常用的页进行刷盘回收,有个LUR链表就是用来给各个页使用频率排序的,链表末尾的在Buffer pool不够使用的时候进行移除,这样保证Buffer pool一直高效率使用.

mysql事物相关

原子性

概述

一般指的是一个事物要么成功,要么失败,不能存在中间状态,如果失败了或者发生错误,那么要恢复到执行事物之前的状态

(没有原子性没发保证多个sql语句执行后,数据的完整性一致性)

操作数据库的功能

BEGIN,START TRANSACTION 开始事务

COMMIT 提交事务

ROLLBACK 回滚事务

数据库实现原理

1一个事务开始后,在执行第一个写操作就会分配一个事务id,后面就使用这个事务id去写undo log

2如果手动rollback,或者发生了错误,那么可以借助这些 undo log进行回滚.这样就保证了事务的原子性

3undo log 可以用于mvcc使用,使得事务可以根据隔离级别选择之前老版本数据进行读取,来解决可重复读问题

4每条记录还有个roll point字段,指向undo log的地址,这样就能找到之前这条记录所有版本的数据

一致性

概述

指的是事物执行完成之后,不能破坏数据库的完整约束. 比如唯一性约束,外健约束等,除了这个还有业务上的一致性.

原子性和隔离性也是保证了一致性的.

(原子性,隔离性,持久性,最终都是体现在一致性上,都是为一致性服务的)

操作数据库的功能

参考 原子性,隔离性,持久性,另外通过数据库的主键和外键约束或者触发器约束

数据库实现原理

参考 原子性,隔离性,持久性,另外通过数据库的主键和外键约束或者触发器约束

隔离性

概述

一般指的是多个事物操作相同数据时候,控制多个事物之间的一个问题.

(没有隔离性没发保证多个事物执行后,数据的完整性一致性)

操作数据库的功能

发生的问题

脏写:两个事务或者以上同时操作一条数据时候,一个事务修改了另外一个事务修改但是未提交的数据.

脏读:两个事务或者以上同时操作一条数据时候,一个事务读取到另外一个事务未提交的数据,如果回滚的话,那么可以说是读到了错误的数据,所以叫脏数据

不可重复读:两个事务或者以上同时操作一条数据时候,一个事务读取数据,另外其他事务一直修改这条数据并且提交了,那么每次读到的数据都不一样,读到的确是是真实的最新数据,那么又叫不可重复读

幻读:两个事务非操作同一条数据,一个事务使用非等值查询,比如范围查询,另外一个事务在这个范围插入数据并且提交,那么之前范围查询会查询出之前没有的记录,被称为幻读(幻读只针对新出现的记录,比如老的记录被删除了,只能称作不可重复读)

设定数据库隔离级别(针对的读操作)

●READ UNCOMMITTED:未提交读。

●READ COMMITTED:已提交读。

●REPEATABLE READ:可重复读。(使用mvcc其实也解决了幻读问题)

●SERIALIZABLE:可串行化。

设置数据库隔离级别语句

SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level;

可以选择全局还是当前会话

加锁(针对的写的操作)

两个事务在操作写同一条记录的时候,会默认加上行锁,第二个及其以后事务发生写语句,那么需要等待

数据库实现原理

1.两个事务对于写的操作冲突,那么直接使用行锁

2.两个事务对于读的操作冲突,使用undo log 生成 readview来解决,又称作mvcc

持久性

概述

一般指的是一个事物完成后,就必须永远有效,永久记录下来事物发生的数据交互操作

(没有持久性没发保证事物执行后,数据的完整性一致性能一直保存下来)

操作数据库的功能

数据库实现原理

1因为我们数据都是在Buffer pool里面的,每次进行写操作都会更新Buffer pool里面的多个页,如果依赖Buffer pool刷盘来保证持久性,那么性能比较差。

2所以为了保证持久性,引入了redo log ,每次对Buffer pool的操作都会记录一组redo log日志,这个记录要比Buffer pool快的多

3当数据库发生宕机时候,Buffer pool里面修改的页来不及刷盘,在重启数据库的时候,读取redo log,然后更新到Buffer pool中,从而使数据库恢复到宕机之前的状态。

4虽然redo log也是加载到一个log Buffer中,但是redo log毕竟小,中间也有刷盘间隔基本可以忽略。redo log的log buffer会保证在事务提交时候进行刷盘,而且保证在Buffer pool刷盘之前,这样来保证已经提交的事务的持久性

总结: 事物的ACID原则都是为了保证事物执行完成后,数据库数据是符合现实世界中业务需求想要达到的一种完整状态.

mysql binlog作用

做主从同步 & 恢复数据

mysql查看事务加锁情况

1.查看事务是否自动提交 SHOW VARIABLES LIKE 'autocommit';

2innodb_locks(加的行锁都会展示)表:该表中会记录一些锁信息 MySQL 5.7.21过时

3innodb_lock_wait(发生等待的行锁才会展示):表明当前系统中因为等待哪些锁而让事务进入阻塞状态。MySQL 5.7.21过时( 8.0替换为了performance_schema.data_locks和data_lock_waits)

4SHOW ENGINE INNODB STATUS 也可以查看事务锁情况(这个更详细TRANSACTIONS部分)

相关推荐
HumoChen991 小时前
MySQL tinyint(1)类型数据在经过flink cdc同步到doris后只有0/1问题定位与解决
数据库·mysql·flink
阿乾之铭1 小时前
MySQL数据查询(基础)
数据库·sql·mysql
TuringSnowy2 小时前
SQL_having_pandas_filter
数据库·笔记·sql·mysql·pandas
stark张宇4 小时前
lnmp - BasicAuth、Mysql、Linux的用户管理、ssh免密登录
linux·后端·mysql
alien爱吃蛋挞4 小时前
MySQL之基础篇
数据库·笔记·mysql
爱学的小涛4 小时前
【MySQL】常见的SQL优化方式(一)
数据库·笔记·后端·sql·mysql
xp_fangfei6 小时前
MySQL第11讲--多表查询的介绍
数据库·mysql·oracle
五星资源6 小时前
基于python+flask+mysql的音频信息隐藏系统
python·mysql·flask
ansizy7 小时前
MySQL(面试问题)
mysql·面试
职场人参7 小时前
ppt压缩有什么简单方法?压缩PPT文件的几种方法
数据库·mysql·计算机视觉·ffmpeg·音视频