MySQL基础
整理自掘金小册《MySQL是怎样运行的》,还有高频面试一百问,MySQL优化面试,MySQL重要知识点
图片都来自前者。
一 索引
认识索引
mysql按照记录的主键值从小到大,分页存储。记录之间组成单向链表,页之间组成双向列表。
主键查询是在页目录中用二分法定位到页,然后在页中遍历到指定记录。
类似看书的时候查目录。
不是主键也没有建立索引就是遍历查找所有记录。很慢,所以需要索引。
简单理解一下存储结构是下面这样
上面那一页就是索引页,专门存放目录项记录
实际情况是下面这样,一棵B+树。实际记录都存放在B+树最底层的节点(叶子节点)上。
名字很奇怪的聚簇索引说的就是这(叶子节点是实际记录),在InnoDB存储引擎中,聚簇索引就是数据的存储方式(所有的用户记录都存储在了叶子节点),也就是所谓的索引即数据,数据即索引。
上面是按照主键排列的,可以实现主键的快速查找。想要实现其他条件的快速查找就要重新排列了,这就是建索引。按照索引列排列,建一颗B+树。 不同的是,叶子节点不是真实记录,只有对应的主键值,所以需要去聚簇索引中再找一次。这个操作叫回表,以时间换空间。比聚簇索引(主键索引)多了一个回表操作,所以也叫二级索引(辅助索引)
使用索引
建立索引
高频查询字段适合建立索引
联合索引需要注意联合索引中的顺序.
索引不生效的情况
- 使用不等于查询,
- 列参与了数学运算或者函数
- 在字符串like时左边是通配符.类似于’%aaa’.
- 当mysql分析全表扫描比使用索引快的时候不使用索引.
- 当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引.
二 设计优化
使用自增主键
没有主键也建议添加一个自增主键,新的记录会按顺序添加到前一个记录的后面
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" 转载请保留原文链接及作者。