MySQL基础知识点分享
mysql基础知识点
- 事务的原理、特性、事务并发控制
- 常用的字段、含义和区别
- 常用数据库引擎之间的区别
什么是事务
- 事务是数据库并发控制的基本单位
- 事务可以看作是一系列SQL语句的集合
- 事务必须要么全部执行成功,要么全部执行失败(回滚)(原子性)
事务的ACID特性
ACID是事务的四个基本特性
- 原子性(Atomicity):一个事务中所有操作全部完成或失败
- 一致性(Consistency):事务开始和结束之后数据完整性没有破坏(A转账50给B,要么失败回滚A50,要么B加50,不能凭空消失)
- 隔离性(Isolation):允许多个事务同时对数据库修改和读写
- 持久性(Durability):事务结束后,修改是永久的不会丢失,一般保存到磁盘上
事务的并发控制可能产生哪些问题
- 幻读(phantom read):一个事务第二次出现第一次没有的结果
- 非重复读(nonrepeatable read):一个事务重复读两次得到不同的结果
- 脏读(dirty read):一个事务读取到另一个事务还没有提交的修改
- 修改丢失(lose update):并发的时候导致一些修改丢失
四种事务隔离级别
- 读未提交(read uncommitted):别的事务可以读取到还没提交的修改
- 读已提交 (read committed):别得事务只能读取到提交的修改
- 可重复读(repteatable read):同一事务先后查询结果一样(Mysql默认级别)
- 串行化(Serialized):事务完全串行化的执行,隔离级别最高,执行效率最低
解决高并发场景下插入重复的问题
- 使用数据库的唯一索引
- 使用队列异步写入
- 使用redis等实现分布式锁
乐观锁和悲观锁
- 悲观锁是先获取锁再进行操作。一锁二查三更新 select for update
- 乐观锁先修改,更新的时候发现数据以及改变就回滚(check and set)一般通过版本号来识别
- 使需要根据响应速度、冲突频率、重试代价来判断使用哪一种
MyISAM和InnoDB
-
MyISAM不支持事务,Innodb支持事务
-
MyISAM不支持外键,Innodb支持外键
-
MyISAM不支持行锁,Innodb支持行锁和表锁
-
myisam引擎的数据在物理磁盘上是按照顺序存储的,而innodb引擎的表数据是随机分布的
-
myisam的主键索引的叶子节点只存放数据在物理磁盘上的指针,其他次索引也是一样的;
- innodb的主键索引的叶子节点下面直接存放数据,其他次索引的叶子节点指向主键id;
Mysql索引
- 索引的原理、类型、结构
- 创建索引的注意事项、使用原则
- 如何排查和消除慢索引
为什么需要索引
- 索引是数据表中一个或者多个列进行排序的数据结构
- 索引能够大幅提升检索速度
- 创建、变更索引也是需要时间和空间
查找结构的历史
- 线性查找:一个个查找,简单,慢
- 二分查找:有序、简单;要求有序,插入慢
- 哈希查找:查询快,占用空间大,不太适合大规模数据
- 二叉树查找:插入和查询很快(log(n)),无法存储大量数据,容易出现复杂度退化
- 二插平衡树查找:解决二插查找树(BST)的退化问题,树是平衡的,节点多的时候,树还是比较高
- 多路树查找:一个父亲节点多个孩子节点,树高不会特别深
- 多路平衡树查找:B-Tree,缺点:不能范围查找
什么是B-Tree
- 多路平衡查找树(每个节点最多m(m>2)个孩子,称为m阶或者度)
- 叶节点具有相同的高度
- 节点中的数据key从左到右是递增有序的
- 五阶树
什么是B+树
B-Tree的变形
- 只有叶子节点带有指向记录的指针(为什么?可以空出更多的空间,可以增加树的高度)
- 叶子节点通过指针相连(可以进行范围查询)
- 为了操作系统更好读取和缓存我们的数据,我们以磁盘块的大小来觉得B+树的阶,让操作系统更好的加载缓存
Mysql创建索引类型
- 普通索引
- 唯一索引,索引列的值必须唯一
- 多列索引
- 主键索引,一个表只有一个
- 全文索引,Innodb不支持
什么时候创建索引
- 经常使用查询条件的字段(where)
- 经常用作表连接的字段
- 经常出现order_by,group_by之后的字段
创建索引有哪些需要注意
- 非空字段NOT NULL,Mysql很难对空值做查询优化,所以很多在创建字段的时候回提供默认值,不为空
- 区分度大,离散度高,作为索引字段尽量不要大量重复相同的值
- 索引长度不能太长(比如字符串太长比较的时候容易耗费时间)
索引什么时候失效
记忆口诀:模糊匹配、隐式转换、最左原则,key没有办法比较的时候,就会实现
- 以%开头的LIKE语句,模糊搜查
- 出现隐式类型转换(在Python这种动态语言查询中需要注意(str转int)
- 没有满足最左前缀匹配原则(为什么最左匹配,abc,ab,a可以,bc不可以,因为少了a的基准无法比较)
什么是聚集索引和非聚集索引
- 聚集还是非聚集指的是B-Tree叶子节点存的是指针还是数据记录
- MyISAM索引和数据分离,使用的是非聚集索引
- InnoDB数据文件就是索引文件,主键索引就是聚集索引
排查慢查询的问题
慢查询通常是缺少索引、索引不合理或者业务代码实现导致
- slow_query_log_file 开启并查询慢查询日记
- 通过explain排查索引的问题
- 调整数据修改索引;业务代码层限制不合理访问
数据库锁(乐观锁和悲观锁、表锁和行锁、意向锁)
-
乐观锁:通常认为别的线程不会修改数据,从而不上锁,只会判断数据是否发生了改变,通常使用版本号来进行判断,然后交给业务层去处理
-
悲观锁:认为别的线程会修改数据,所以每次拿数据都会上锁
-
表锁:直接锁定整张表,在你锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则读也不允许。
- 行锁:仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。
- 共享锁(读锁)、排他锁(写锁):顾名思义,共享锁可以被别人的线程读取,但不能修改,排它锁不能被别的线程读取和修改
- 意向锁:行锁和表锁的出现,为了提高效率,先申请表的意向共享锁,再申请行的写锁
一范式、二范式和三范式