MySQL2(mysql2003错误)
多版本并发控制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主键更适合那些不容易改变的唯一标识,如自动递增列,身份证号等。