Mysql基础知识和索引 学习笔记

mysql基础知识点

  1. 事务的原理、特性、事务并发控制
  2. 常用的字段、含义和区别
  3. 常用数据库引擎之间的区别

什么是事务

  1. 事务是数据库并发控制的基本单位
  2. 事务可以看作是一系列SQL语句的集合
  3. 事务必须要么全部执行成功,要么全部执行失败(回滚)(原子性)

事务的ACID特性

ACID是事务的四个基本特性

  1. 原子性(Atomicity):一个事务中所有操作全部完成或失败
  2. 一致性(Consistency):事务开始和结束之后数据完整性没有破坏(A转账50给B,要么失败回滚A50,要么B加50,不能凭空消失)
  3. 隔离性(Isolation):允许多个事务同时对数据库修改和读写
  4. 持久性(Durability):事务结束后,修改是永久的不会丢失,一般保存到磁盘上

事务的并发控制可能产生哪些问题

  1. 幻读(phantom read):一个事务第二次出现第一次没有的结果
  2. 非重复读(nonrepeatable read):一个事务重复读两次得到不同的结果
  3. 脏读(dirty read):一个事务读取到另一个事务还没有提交的修改
  4. 修改丢失(lose update):并发的时候导致一些修改丢失

四种事务隔离级别

  1. 读未提交(read uncommitted):别的事务可以读取到还没提交的修改
  2. 读已提交 (read committed):别得事务只能读取到提交的修改
  3. 可重复读(repteatable read):同一事务先后查询结果一样(Mysql默认级别)
  4. 串行化(Serialized):事务完全串行化的执行,隔离级别最高,执行效率最低

解决高并发场景下插入重复的问题

  1. 使用数据库的唯一索引
  2. 使用队列异步写入
  3. 使用redis等实现分布式锁

乐观锁和悲观锁

  1. 悲观锁是先获取锁再进行操作。一锁二查三更新 select for update
  2. 乐观锁先修改,更新的时候发现数据以及改变就回滚(check and set)一般通过版本号来识别
  3. 使需要根据响应速度、冲突频率、重试代价来判断使用哪一种

MyISAM和InnoDB

  1. MyISAM不支持事务,Innodb支持事务
  2. MyISAM不支持外键,Innodb支持外键
  3. MyISAM不支持行锁,Innodb支持行锁和表锁
  4. myisam引擎的数据在物理磁盘上是按照顺序存储的,而innodb引擎的表数据是随机分布的
  5. myisam的主键索引的叶子节点只存放数据在物理磁盘上的指针,其他次索引也是一样的;
  6. innodb的主键索引的叶子节点下面直接存放数据,其他次索引的叶子节点指向主键id;

Mysql索引

  1. 索引的原理、类型、结构
  2. 创建索引的注意事项、使用原则
  3. 如何排查和消除慢索引

为什么需要索引

  1. 索引是数据表中一个或者多个列进行排序的数据结构
  2. 索引能够大幅提升检索速度
  3. 创建、变更索引也是需要时间和空间

查找结构的历史

  1. 线性查找:一个个查找,简单,慢
  2. 二分查找:有序、简单;要求有序,插入慢
  3. 哈希查找:查询快,占用空间大,不太适合大规模数据
  4. 二叉树查找:插入和查询很快(log(n)),无法存储大量数据,容易出现复杂度退化
  5. 二插平衡树查找:解决二插查找树(BST)的退化问题,树是平衡的,节点多的时候,树还是比较高
  6. 多路树查找:一个父亲节点多个孩子节点,树高不会特别深
  7. 多路平衡树查找:B-Tree,缺点:不能范围查找

什么是B-Tree

  1. 多路平衡查找树(每个节点最多m(m>2)个孩子,称为m阶或者度)
  2. 叶节点具有相同的高度
  3. 节点中的数据key从左到右是递增有序的
  4. 五阶树
    在这里插入图片描述

什么是B+树

B-Tree的变形

  1. 只有叶子节点带有指向记录的指针(为什么?可以空出更多的空间,可以增加树的高度)
  2. 叶子节点通过指针相连(可以进行范围查询)
  3. 为了操作系统更好读取和缓存我们的数据,我们以磁盘块的大小来觉得B+树的阶,让操作系统更好的加载缓存

Mysql创建索引类型

  1. 普通索引
  2. 唯一索引,索引列的值必须唯一
  3. 多列索引
  4. 主键索引,一个表只有一个
  5. 全文索引,Innodb不支持

什么时候创建索引

  1. 经常使用查询条件的字段(where)
  2. 经常用作表连接的字段
  3. 经常出现order_by,group_by之后的字段

创建索引有哪些需要注意

  1. 非空字段NOT NULL,Mysql很难对空值做查询优化,所以很多在创建字段的时候回提供默认值,不为空
  2. 区分度大,离散度高,作为索引字段尽量不要大量重复相同的值
  3. 索引长度不能太长(比如字符串太长比较的时候容易耗费时间)

索引什么时候失效

记忆口诀:模糊匹配、隐式转换、最左原则,key没有办法比较的时候,就会实现

  1. 以%开头的LIKE语句,模糊搜查
  2. 出现隐式类型转换(在Python这种动态语言查询中需要注意(str转int)
  3. 没有满足最左前缀匹配原则(为什么最左匹配,abc,ab,a可以,bc不可以,因为少了a的基准无法比较)

什么是聚集索引和非聚集索引

  1. 聚集还是非聚集指的是B-Tree叶子节点存的是指针还是数据记录
  2. MyISAM索引和数据分离,使用的是非聚集索引
  3. InnoDB数据文件就是索引文件,主键索引就是聚集索引

排查慢查询的问题

慢查询通常是缺少索引、索引不合理或者业务代码实现导致

  1. slow_query_log_file 开启并查询慢查询日记
  2. 通过explain排查索引的问题
  3. 调整数据修改索引;业务代码层限制不合理访问
发布了20 篇原创文章 · 获赞 6 · 访问量 2814

猜你喜欢

转载自blog.csdn.net/qq_37316153/article/details/104420106