2020-11-07-Mysql(优化基础)
2020-11-20 本文已影响0人
冰菓_
1.三大范式
- 第一范式:确保每列的原子性(强调的是列的原子性,即列不能够再分成其他几列).
- 第二范式:在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关(一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的部分)
- 第三范式:在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关(另外非主键列必须直接依赖于主键,不能存在传递依赖).
2.explain
(索引)
image.png
(哪些情况用索引)
image.png
(id 注意如果有虚拟表则虚拟表的后面的数字是id号)
image.png
(select_type)
image.png
(type)
image.png
(是否用到了索引)
image.png image.png image.png image.png
(extra)
image.png
3.索引优化
image.pngimage.png
4.为什么不建议用select * ?
假设某一天修改了表结构,如果用select *,返回的数据必然会会变化,客户端
是否对数据库变化作适配,是否所有地方都做了适配,这都是问题。
可能会存在不需要的列,传输过程中有不必要的性能损耗;
客户端解析查询结果也需要更多损耗
5.例题
使用了select ,必然导致数据库需要先解析代表哪写字段,从数据字段中将*转化为具体的字段含义,存在性能开销;
由于覆盖索引我们可能只要获取索引,select * 增加了不必要的io流
6.order by
image.png7.锁理论
image.png脏读 :
读取到了未提交的数据(如果事务这时候回滚了,那么第二个事务就读到了脏数据)
不可重复读
重点是修改:在同一事务中,同样的条件,第一次读的数据和第二次读的数据不一样。(一个事务多次读取同一范围内数据时,另外一个事务发生insert操作并提交了)。数据变化。
幻读
重点在于新增或者删除:在同一事务中,同样的条件,,第一次和第二次读出来的记录数不一样。(一个事务多次读取同一条数据时,另外一个发生了事务发生update,delete操作并提交了。insert操作一条新数据并不会影响刚才被读的那条数据。)。行数变化。
(读取数据一致性的描述)
image.png image.png
(锁住行)
image.png image.png