一、MySQL
1、MySQL数据存储引擎
1.1 InnoDB
1.1.1 总体介绍
默认引擎,也是首选引擎,是事务型数据库的默认引擎
支持事务(ACID) 、行锁定、外键
InnoDB处理巨大数据性能高
1.1.2 InnoDB自适应hash索引
InnoDB在简历索引的时候,只简历B+tree索引,不会简历hash索引。
但是hash索引也有自己特点,在等值查询的时候效率更高, InnoDB会自动创建hash索引。
当InnoDB认为连续3次被访问的非聚集索引 是 热点数据,就给这个热点数据 自动创建hash索引。
1.2 MyISAM
MyISAM 不支持事务,没有ACID
不支持行级锁、支持表级锁
不支持外键
批量插入快
内存消耗相对少
1.3 InnoDB 与MyISAM的区别
外键:innodb支持 myisam不支持
锁:innodb行级锁,myisam表级锁
事物:innodb支持,myisam不支持
查询添加速度:myiasm比innodb插入快
内存使用:mysiam比innodb空间使用率低
1.3 Memory
数据都存储在内存中,不需要磁盘IO,速度很快;但是重启后,表结构会保留,数据会丢失,不能持久化数据。
1.4 CSV
CSV引擎是将普通的CSV文件作为MySQL的表来处理, 不支持索引
2、B树 B+树
2.1 什么是B树
2.2 什么是B+树
只需要说出B+树几个特点。
① 中间节点不存数据,数据都存到叶子节点
②叶子节点由链表组成,且前后相连,形成 环形链表
③ 中间节点存储子节点的 最大值或最小值。
2.3 B+树比B树更适合数据库索引
文件或数据库存储的数据都很大,不能都放入到内存中,必须在磁盘中进行读写,则索引应该尽可能少对磁盘进行IO操作。
B+树相比B树更矮,查询IO次数更少。
B+树查询都是查到叶子节点,查询更稳定。
B+树方便扫库(遍历),B+树直接从子节点挨个扫一遍就可以,支持range-query非常方便。
2.4 主键 是是有自增ID还是UUID
对于InnoDB的主索引,数据会安装主键进行排列,由于UUID是无序的,会产生很大IO压力,因此UUID不适合做物理主键,物理主键使用自增ID,可以把UUID作为逻辑主键。
在实际开发中 如果历史数据表与 当前数据表进行合表操作,两个表都是自增id做主键,如果合并,id会造成冲突,这个时候使用UUID做id的值,则id是相互独立的,不会存在数据表合并的问题。
3、脏页
数据页是数据文件中的最小存储单元,页面的大小是8*1024个字节,页面含有一个96字节长度的头部,所以,每个页面只能保存8096个字节的数据
3.1 什么是脏页
当内存数据页和磁盘中数据页(数据库中数据页) 内容不一致的时候,我们称内存页为 脏页。
内容一致的时候,成为干净页。
更新的操作,都写到内存、日志中,不会马上同步到磁盘数据,这个时候内存数据页就是脏页。
一条SQL语句 正常快,有时候慢,这个慢的时候 可能就是讲脏页同步到磁盘上。
3.2 脏页同步
什么时候做脏页同步:
redo log写满了,停止更新,需要讲更新的部分日志对应的脏页同步到磁盘。
当系统内存不足时,淘汰部分数据页,如果是脏页,则先更新脏页。
mysql正常关闭时,会把内存脏页都同步到磁盘上。
4、数据库索引
聚集(clustered)索引,也叫聚簇索引。
数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
MySQL里主键就是聚集索引3
该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。
5、数据库事务
事物:
一组原子性的sql查询,是一个独立的工作单元,要么全部执行,要么全部不执行
bin-log
记录数据库变化情况,可以对数据进行复制和备份,常常用作主从库同步
mysql事物日志:
redo log 重做日志提供前滚操作,是innoDB引擎层日志,记录事物操作引起的数据变化,记录的是数据页物理层修改
undo log 回滚日志提供回滚操作,是innoDB引擎层日志,作用对数据进行回滚
事物四大特性:
原子性 一致性 隔离性 持久性
事物并发可能出现的三种问题:
脏读
幻读
不可重复读
mysl事物的隔离级别:
读未提交:就是一个事务可以读取另一个未提交事务的数据
提交不成功带来脏读,成功带来幻读和不可重复读
读已提交:就是一个事务要等另一个事务提交后才能读取数据。
避免了脏读,但是还会有幻读和不可重复读
可重复读:所有被 Select 获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。
避免了脏读和不可重复读,但是有幻读
可串行化:是最高的事务隔离级别,在该级别下,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
6、数据库锁
事物并发的时候数据不一致,比如库存超卖,所以通过锁来保证访问次序
力度划分:行级锁,表级锁,页级锁
对表test_table增加读锁:
LOCK TABLES test_table READ
UNLOCK test_table
对表test_table增加写锁
LOCK TABLES test_table WRITE
UNLOCK test_table
死锁的原因:
两个事物都持有对方需要的锁,都在等待对方释放锁,并且都不会释放自己的锁
避免死锁:
不同程序并发存取多个表,建议以相同的顺序访问表
同一个事物中,尽量一次锁定所需要的全部资源
容易产生死锁的业务部分,升级锁的粒度,通过表级锁减少死锁概率
innoDB如何对待死锁:
发起死锁检测,主动回滚一条事务,让其他事物继续执行
优化锁:
减少锁持有时间
减少锁粒度,少用表锁,缩小锁定范围
读写分离锁替换独占锁
7、mysql优化
8、mysql主从操作
9、常见SQL语句
二、Redis
1、Redis