四时宝库

程序员的知识宝库

MySQL2(mysql2002解决办法)


多版本并发控制MVCC的理解

保存数据的历史版本,根据比较版本号来处理数据,记录中的3个隐含字段、undo log日志、Read View实现的

是一种非堵塞、读不加锁,读写不冲,同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题。

缺点是每行记录都需要额外的存储空间,需要做更多的行维护和检查工作。 数据库可重复读会出现幻读

数据库事务ACID

事务有四个特点:原子性、一致性、隔离性和持久性。

事务的原子性, 全部执行成功,要么全部执行失败。

事务的隔离性,表示在事务执行过程中对数据的修改,在事务提交之前对其他事务不可见。

事务的持久性,表示事务完成之后,对系统的影响是永久性的。如果已提交的数据在事务执行失败时,数据的状态都应该正确。

事务的一致性,表示当事务执行失败时,所有被该事务影响的数据都应恢复到事务执行前的状态,这称为事务回滚。执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,

转账者和收款人的总额应该是不变的


数据库三大范式

o 第一范式:1NF 原子性,列或者字段不能再分

o 第二范式:2NF 唯一性,一张表只说一件事 ,要求记 录有惟 一标识;

o 第三范式:3NF 直接性, 每个属性都跟主键有直接关系, 而不是间接关系。

MySQL 存储引擎对比

Innodb 支持事务 行锁和无锁读 外键 ,在线热备份,具备提交、回滚以及崩溃恢复的功能以保护用户数据。 行锁和无锁读提升了它的多用户并发数以及性能

MyISAM:MyISAM 既不支持事务、也不支持外键、其优势是访问速度快,但是表级

别的锁定限制了它在读写负载方面的性能,因此它经常应用于只读或者以读为主的

数据场景。

SQL 标准定义了四个隔离级别

READ-UNCOMMITTED(读取未提交):*最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。

oREAD-COMMITTED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。

oREPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。

oSERIALIZABLE(可串行化):最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

事务隔离级别越严格,数据库效率越低。

MySQL 默认的事务隔离级别是:REPEATABLE-READ 级别

行锁和表锁

InnoDB 支持表锁和行锁,默认为行锁。

MyISAM 只支持表锁

行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。

当增删改查匹配到索引时,Innodb 会使用行级锁

如果没有匹配不到索引,那么就会直接使用表级锁

表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。

当执行 DDL 语句去修改表结构时,会使用表级锁。

索引的类型

数据结构-物理存储-逻辑角度

o 从数据结构角度 1. 树索引 (O(log(n))) 2. Hash 索引

从物理存储角度 1. 聚集索引(clustered index) 2. 非聚集索引(non-clustered index)

o从逻辑角度 1. 普通索引 2. 唯一索引 3. 主键索引 4. 联合索引

为什么使用数据库连接池?

1它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;

2避免因为没有释放数据库连接而引起的数据库连接遗漏。

3能够处理无效连接,限制连接池中的连接总数不低于或者不超过某个限定值

hikariCP>druid>tomcat-jdbc>dbcp>c3p0

druid 功能最为全面,sql 拦截等功能,统计数据较为全面,具有良好的扩展性

Springboot2.0 以后默认数据库连接池选择了 Hikari(性能高)

为什么要有缓存池?

Mysql 的 innodb 存储引擎是基于磁盘存储的,并且是按照页的方式进行管理的。

可以看到,无论是读操作还是写操纵,都是对缓存池进行操作,而不是直接对磁盘进行操纵。

缓存池的大小最多应设置为物理内存的 80%

缓存池个数设置为 CPU 的个数

聚集索引与非聚集索引

InnoDB 必须要有且只有一个聚集索引,聚集索引的叶子节点存储行记录

聚集索引主键查询非常快,直接定位行记录。

  • 数量不同。 一个表中只能有一个聚集索引,而非聚集索引可以有多个。
  • 磁盘 IO 次数不同。 聚集索引通过一次索引查询可以直接找到数据,而非聚集索引需要一次索引查询到数据地址,外加一次数据磁盘 IO。
  • 数据组织方式不同。 聚集索引的数据行在物理存储上是有序的,对于范围查询和排序操作,有序的物理存储结构也有助于减少磁盘 I/O 操作,提高查询性能。非聚集索引和数据行是分开两个文件存放,数据行在物理存储上是乱序的。
  • 读写性能不同。 聚集索引查询效率高,但插入效率低,因为需要移动数据的物理位置保证物理存储上有序。非聚集索引则反过来,插入效率高,查询效率低。

聚集索引-,更适合 between and 和 order by 操作。

非聚集索引 多个索引会影响 insert 和 update 的速度。

那么InnoDB有了聚簇索引,为什么还要有二级索引呢?

聚簇索引的叶子节点存储了一行完整的数据,而二级索引只存储了主键值,相比于聚簇索引,占用的空间要少

当我们需要为表建立多个索引时, 聚簇索引占用大量空间,

所以InnoDB中主键所建立的是聚簇索引,而唯一索引、普通索引、前缀索引等都是二级索引。

二级索引的叶子节点中存储主键值,每次查找数据时,根据索引找到叶子节点中的主键值,根据主键值再到聚簇索引中得到完整的一行记录。

MySQL 都有哪些函数?

日期函数 系统当前时间:NOW() 替换 replace 截取字符串:substrs

拼接字符串:CONCAT 日期转字符串:DATE_FORMAT(date,format)

聚合函数:avg、sum、count、min、min

绝对值:ABS(x) 取余:MOD(x,y)

sQL Select 语句完整的执行顺序

FROM 表1 ON 表2 WHERE 条件 GROUP BY 分组字段 HAVING 条件 SELECT 字段 ORDER BY 条件 LIMIT 条件;

将10亿数据文本转储数据库的最高效的方案是什么?

批量插入 多线程

百万数据怎么快速查询出一条数据?

按数据库 id 分表多个小表,每个小表设置索引。查询接口根据 id 指向相应的小表。

基于索引再排序 limit 分页,where 放第一位,limit 用到的主键放第 2 位,而且只能 select 主键解决limit页数变大效率低的情况

主键索引和唯一索引的区别

区别

1 主键是一种约束创建后一定包含一个唯一性索引列不允许为空值,唯一索引是一种索引不一定就是主键 列允许空值。

2 主键可以被其他表引用为外键,而唯一索引不能。

3一个表最多只能创建一个主键,但是可以创建多个唯一索引。

4主键更适合那些不容易改变的唯一标识,如自动递增列,身份证号等。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接