MySQL基础

整理自掘金小册《MySQL是怎样运行的》,还有高频面试一百问MySQL优化面试MySQL重要知识点

图片都来自前者。

一 索引

认识索引

mysql按照记录的主键值从小到大,分页存储。记录之间组成单向链表,页之间组成双向列表。

主键查询是在页目录中用二分法定位到页,然后在页中遍历到指定记录。

类似看书的时候查目录。

不是主键也没有建立索引就是遍历查找所有记录。很慢,所以需要索引。

简单理解一下存储结构是下面这样

上面那一页就是索引页,专门存放目录项记录

实际情况是下面这样,一棵B+树。实际记录都存放在B+树最底层的节点(叶子节点)上。

名字很奇怪的聚簇索引说的就是这(叶子节点是实际记录),在InnoDB存储引擎中,聚簇索引就是数据的存储方式(所有的用户记录都存储在了叶子节点),也就是所谓的索引即数据,数据即索引。

上面是按照主键排列的,可以实现主键的快速查找。想要实现其他条件的快速查找就要重新排列了,这就是建索引。按照索引列排列,建一颗B+树。 不同的是,叶子节点不是真实记录,只有对应的主键值,所以需要去聚簇索引中再找一次。这个操作叫回表,以时间换空间。比聚簇索引(主键索引)多了一个回表操作,所以也叫二级索引(辅助索引)

使用索引

建立索引

高频查询字段适合建立索引

联合索引需要注意联合索引中的顺序.

索引不生效的情况

  1. 使用不等于查询,
  2. 列参与了数学运算或者函数
  3. 在字符串like时左边是通配符.类似于’%aaa’.
  4. 当mysql分析全表扫描比使用索引快的时候不使用索引.
  5. 当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引.

二 设计优化

使用自增主键

没有主键也建议添加一个自增主键,新的记录会按顺序添加到前一个记录的后面

uuid写入近似于随机(因为是按照字符来排序的),插来插曲效率低

使用NOT NULL

理由很多,不用就完事了

定长比非定长查询效率高
选择小的数据类型
注释写好点
单表字段不宜过多

二三十个是极限了

冗余字段

我倾向多一点冗余,减少连表查询,也不使用子查询

三 查询优化

慢查询的原因

是查询条件没有命中索引?

是load了不需要的数据列?

还是数据量太大?

所以优化也是针对这三个方向来的,

  • 首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写.
  • 分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引.
  • 如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表.

四 事务

事务的英文是transaction,其实本义是交易,买卖的意思。事务不够直观

需要符合AICD特性的一个或多个数据库操作称为事务

A atomicity 原子性:不可分割,要么做要么不做,不存在中间状态

I isolation 隔离性:本次操作不受其他操作影响

C consistency 一致性:符合现实世界的约束,比如你在银行里只有5块钱,不可能取出6块钱来

D durability 持久性:操作产生的状态转换是稳定的

事务的状态

1 活动的(active)

操作正在执行

2 部分提交的(partially committed)

最后一个操作执行完成,刷新到磁盘前

3 失败的(failed)

1或2执行失败后

4 中止的(aborted)

失败之后需要回滚 ,回滚后

5 提交的(committed)

2提交成功后

还没用到,写支付的时候再来吧

五 锁

有并发事务的时候通过锁来保证访问的次序。

需要的时候再来吧。

六 其他

explain

小册总结得很好,就不copy了

文章标题:MySQL基础

本文作者:Benny

发布时间:2019-10-10, 14:57:39

最后更新:2019-10-10, 16:29:02

原始链接:https://benny233.github.io/2019/10/10/MySQL基础/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录