Python社区  »  DATABASE

2020-11-07-Mysql(优化基础)

隐约喜欢萌萌哒 • 2 周前 • 24 次点击  

1.三大范式

  • 第一范式:确保每列的原子性(强调的是列的原子性,即列不能够再分成其他几列).
  • 第二范式:在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关(一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的部分)
  • 第三范式:在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关(另外非主键列必须直接依赖于主键,不能存在传递依赖).
image.png
image.png

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.png

image.png

4.为什么不建议用select * ?

假设某一天修改了表结构,如果用select *,返回的数据必然会会变化,客户端
是否对数据库变化作适配,是否所有地方都做了适配,这都是问题。
可能会存在不需要的列,传输过程中有不必要的性能损耗;
客户端解析查询结果也需要更多损耗

5.例题

使用了select ,必然导致数据库需要先解析代表哪写字段,从数据字段中将*转化为具体的字段含义,存在性能开销;
由于覆盖索引我们可能只要获取索引,select * 增加了不必要的io流

image.png

6.order by

image.png

7.锁理论

image.png

脏读 :
读取到了未提交的数据(如果事务这时候回滚了,那么第二个事务就读到了脏数据)

不可重复读
重点是修改:在同一事务中,同样的条件,第一次读的数据和第二次读的数据不一样。(一个事务多次读取同一范围内数据时,另外一个事务发生insert操作并提交了)。数据变化。

幻读
重点在于新增或者删除:在同一事务中,同样的条件,,第一次和第二次读出来的记录数不一样。(一个事务多次读取同一条数据时,另外一个发生了事务发生update,delete操作并提交了。insert操作一条新数据并不会影响刚才被读的那条数据。)。行数变化。

(读取数据一致性的描述)


image.png
image.png

(锁住行)


image.png
image.png
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/99124
 
24 次点击  
分享到微博