数据库
一、数据库设计三范式
第一范式:一个列只能存储一个值,是不可分割的。
第二范式:一张表中必须要有一个唯一主键。
第三范式:当A表关联到B表时,只能关联B表的主键列,不能关联到其他非主键列。
二、SQL语句
DDL: 数据库定义语言,主要用于对数据库、表进行增删改操作
CREATE DATABASE/TABLE
DROP DATABASE/TABLE
SHOW DATABASE/TABLES
USE <db name>
DML: 数据库操作语言,对表中的数据进行增删改操作
INSERT INTO
DELETE FROM <table>
UPDATE <table> SET
DQL: 数据查询语言,主要对数据进行查询操作
单表查询
基础查询
SELECT
FROM
DISTINCT
过滤查询:WHERE
分页查询:LIMIT
分组查询:GROUP BY
排序: ORDER BY ASC/DESC
聚合/分组/单行函数:COUNT、SUM、AVG、MAX、MIN
多行函数:IF、IFNULL、DATE_FORMAT
连表查询
JOIN
LEFT/RIGHT JOIN
子查询:多条查询语句组合起来的查询语句
DTL: 事务操作语言
BEGIN
COMMIT
ROLLBACK
三、JDBC
JDBC访问数据库的基本步骤是什么?
- 加载驱动
- 通过DriverManager对象获取连接对象Connection
- 通过连接对象获取会话
- 通过会话进行数据的增删改查,封装对象
- 关闭资源
注册驱动(Driver):Class.forName("com.mysql.jdbc.Driver");
获取连接对象:Connectinon conn = DriverManager.getConnection();
创建语句对象:PrepareStatement pstmt = conn.parepareStatement("sql");
// 设置参数 pstmt.setString(1, "参数");
执行语句:int row = pstmt.executeUpdate();
ResultSet rs = pstmt.executeQuery();
关闭资源
四、事务(ACID)
什么是事务?
将多个业务操作看做一个事务单元,要么都成功,要么都失败。
事务四个特性
A: 原子性:把一个事务看做最小单位,不可分割,事务中的多个操作要么都成功,要么都失败。
C: 一致性:事务前后结构一致性;事务前后数据与业务预期一致性。
I: 隔离性:当产生多个事务同时执行时,事务与事务之间数据是互不影响的。
D: 持久性:事务操作结束后,数据会持久化保存到磁盘中。
事务并发的问题
脏读:在一个事务中读取到另一个事务未提交的数据。
幻读:在一个事务中,前后读取数据的数量不一致,通常时增、删除操作导致的。
MVCC: 多事务版本并发控制技术解决幻读问题。
不可重复读:同一个事务中,前后读取同一份数据不一致,通常是因为数据被修改了导致的。
事务隔离级别
READ_UNCOMMITED(读未提交):啥也没解决
READ_COMMITED(读已提交):解决脏读问题
REPEATABLE(可重复读):解决脏读、不可重复度问题
SERIALIZE(串行化):都解决
五、索引
索引:
索引是为了帮助MySql可以快速检索到对应数据的一种数据结构。
数据结构:
Hash、B+TREE
索引是否越多越好?
增加索引可以提升基于索引列的查询效率,但是会的整张表的增删改都增加性能负担,因此并不是索引越多越好,尽量要选择何事的列作为缩影。 推荐单表索引数量在3个左右。
索引的分类
主键索引
非主键索引:叶子节点最终存储的数据是这行数据锁对应的主键索引的值,因此基于非主键索引查询时,如果要查询完整一行数据,需要重新再基于主键索引树得到完整数据,这个操作称之为回表查询。
专业名词:
聚集/聚簇索引:数据与索引存储再一起
非聚集/聚簇索引:索引与数据时分开存储的
存储引擎
MyISAM
索引:索引文件与数据文件是分开存储的,因此无论是主键索引还是非主键索引,都需要额外的IO去查询数据。
不支持事务
表级锁
表的总数量会专门存储
相对查询效率高
InnoDB
索引:索引与数据都存在一个文件中,那么对于主键索引来说,直接单个文件的IO就可以查询到需要的数据,对于非主键索引来说需要回表查询。
支持事务
行级锁
总数需要全表扫描统计