rrain7 / 2021Records

缅怀一下荒废的上半年
0 stars 0 forks source link

八股文-数据库 #6

Open rrain7 opened 2 years ago

rrain7 commented 2 years ago

MySQL

读写锁

在处理并发读写问题时,可以通过实现一个有两种类型的锁组成的锁系统来解决问题。

这两种类型的锁通常称为 共享锁(shared lock)排他锁(exclusive lock),也称 「读锁」 和 「写锁」。

索引

索引可以包含一个或者多个列的值。若索引包含了多个列,那么索引的顺序也十分重要,因为MySQL只能高效的使用索引的最左前缀列。

索引的类型

InnoDB引擎有一个特殊的功能叫做"自适应哈希索引", 当InnoDB注意到某些索引值被使用得非常频繁时,它会在内存中基于B+Tree索引之上再创建一个哈希索引,这样就让B+Tree索引也具有哈希索引的一些优点,比如快速的哈希查找。

索引的优点

最常见的B+Tree索引,按照顺序存储数据,所以MySQL可以用来 做ORDER BYGROUP BY 操作。因为数据是有序的,所以B+Tree也就会将相关的列值都存储在一起。最后,因为索引中存储了实际的列值,所以某些查询只使用索引就能够完成全部查询。

总结如下:

  1. 索引大大减少了服务器需要扫描的数据量。
  2. 索引可以帮助服务器避免排序和临时表。
  3. 索引可以将随机I/O变为顺序I/O。

高性能的索引策略

正确地创建和使用索引是实现高性能查询的基础。

高效地选择和使用索引有很多种方式,其中有些是针对特殊案例的优化方法,有些则是针对特定行为的优化。使用哪个索引,以及如何评估选择不同索引的性能影响的技巧,则需要持续不断地学习。

查询性能优化

MySQL是如何执行查询的?

为什么查询速度会慢?

如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行得更快。

通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。

其中,执行 可以认为是整个生命周期中最重要的阶段,这其中包括了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组等。

查询需要在不同的地方花费时间,包括网络,CPU计算,生成统计信息和执行计划、锁等待(互斥等待)等操作,尤其是向底层存储引擎检索数据的调用操作,这些调用需要在内存操作、CPU操作和内存不足时导致的I/O操作上消耗时间。根据存储引擎不同,可能还会产生大量的上下文切换以及系统调用。

在每一个消耗大量时间的查询案例中,我们都能看到一些不必要的额外操作、某些操作被额外地重复了很多次、某些操作执行得太慢等。优化查询的目的就是减少和消除这些操作所花费的时间。

慢查询基础:优化数据访问

查询性能低下最基本的原因是访问的数据太多。大部分性能低下的查询都可以通过减少访问的数据量的方式进行优化。

==todo==

rrain7 commented 2 years ago

MySQL 主从问题?