1、存储引擎
-- 查询数据库支持的存储引擎
show engines;
-- 查询当前数据库使用的存储引擎
show variables like '%storage_engines%';
主要的存储引擎说明:
1)MyISAM:无外键、表锁、所有索引都是非聚簇索引、无事务、记录表总条数、删除表以重建表方式
2)Innodb:行锁+表锁、5.6+后支持fulltext、主键是聚簇索引、删除表以按行删除、主键不存在时创建隐藏主键
3)MEMORY:内存型,数据不落磁盘
2、索引结构
1)聚簇索引:索引与数据在一起,索引文件的叶子节点存储实际数据行
2)非聚簇索引:索引文件与数据文件分开,索引的叶子节点存储数据的逻辑地址
3、索引优化
1)回表查询:因为非聚簇索引叶子节点只存储主键ID值,
查询其他字段,需要再次进行主键索引查询,定位到具体
2)索引覆盖:select需要查询的字段只包含索引及主键字段,则直接返回结果,不需要再进行回表查询
3)索引下推:在联合索引(a,b,c),前提是满足最左前缀匹配条件下,
当查询a条件后,如果存在b及c等查询条件。会直接拿出叶子节点的索引值进行比较
而不是通过主键查询行数据再比较。避免了回表
在执行计划中,using index condition 表示使用了索引下推
默认开启,通过设置set optimizer_switch='index_condition_pushdown=off' 关闭
4、数据库3范式(3NF)
1)1NF:所有字段不可拆分,如家庭地址,拆分成省、市、县、街道、小区
2)2NF:没有局部函数依赖,如一张表(学生名、学号、课程名、成绩。。。),
存在学生名+课程名 => 成绩。拆分表,将学生id + 课程id形成联合主键
3)3NF:没有传递函数依赖,如一张表(学生名、院系名、院系地址。。。)。
存在学生名=>院系名=>院系地址
5、join查询
mysql8.0之前的版本,采用nested loop join 嵌套查询方式,以驱动表作为外层循环,被驱动表作为内层循环。导致join效率低下
1)inner join: 两表都包含的数据
2)left join :两表包含 + 左表数据
3)right join:两表包含 + 右表数据
8.0之后,采用hash join。将驱动表数据,以hash表存储在内存中,
只需要遍历一遍被驱动表,即可完成比对。
如果驱动表数据量大,内存不足,则使用磁盘空间,并将数据分片处理。
具体内存大小 使用 join_buffer_size 参数控制。
避免join查询方法:
1)将多表数据读取,由应用程序进行join关联
2)使用冗余字段
3)建立大宽表,或异构到ES中
6、事务
6.1、ACID
原子性:事务是最小单位,不可拆分
一致性:事务执行前后,数据总量保持一致。如转账
隔离性:事务执行是独立的,不会被其他事务影响
持久性:事务执行后,数据要持久保存在磁盘上。
6.2、事务问题
1、脏读:一个事务读取另一个事务未提交的内容
2、不可重复读:读取同一个数据,由于另一个事务UPDATE、DELETE数据后,两次前后不一致。
3、幻读:读取范围数据,由于另一个事务DELETE、INSERT后,导致两次不一致。
6.3、隔离级别
1、读未提交RU:
2、读已提交RC:解决脏读
3、可重复读RR(默认级别):在RC基础上解决不可重复读
4、串行化:在RR基础上解决幻读
1.查看当前会话隔离级别select @@tx_isolation;在MySQL 8.0中:SELECT @@transaction_isolation;2.查看系统当前隔离级别select @@global.tx_isolation;3.设置当前会话隔离级别set session transaction isolatin level repeatable read;4.设置系统当前隔离级别set global transaction isolation level repeatable read;5.命令行,开始事务时set autocommit=off 或者 start transaction
7、日志文件
7.1、存储格式
1、statement:记录实际执行的sql语句
2、row:记录行内容
3、mixed:statement与row结合。
在mysql主从同步中,如果使用statement格式,只记录sql语句,在执行有歧义的语句时,导致主从库数据不一致。
如:delete from user limit 5;
RC级别不支持statement格式
7.2、binlog
记录DDL、DML实际执行的SQL语句,并以二进制形式存储。用于主从同步
7.3、undo log
回滚日志,逻辑日志,记录sql修改前的数据。用于事务回滚。原子性、一致性
每产生一个undo log日志都会有一个trx_id和roll_point生成:
trx_id:保存生成此日志的事务id;
roll_point:将undo log连接起来形成版本连;
7.4、redo log
重做日志,物理日志,记录数据库对磁盘的修改,用于系统崩溃后的修复。持久性、
7.5、relay log
中继日志。用于从库同步主库的binlog日志,记录将要执行的内容。
redolog与binlog 都需要持久化到磁盘
undolog 事务提交后即删除
8、锁分类
1、表锁
select from table for update
2、行锁
where id = 11 for update
如果id主键11存在,则行锁
否则临键锁,查找上、下各一个主键,组成左开右闭的范围锁
区间为 (10,15]
因为id =11是等值查询,退化成间隙锁 (10,15)
select * from t where id >= 10 and id < 11 for update;
3、间隙锁 gap lock
范围锁,左开右开
4、临键锁 next-key lock
范围锁,左开右闭原则