上一部分一起学习了数据库中的ACID等特性。数据库面试系列第二部分同享数据库的调优常用进程,索引底层原理,页机制等。整体思维导图如下所示。

[别被脱裤系列]2 还没深化数据库就浅出了
[别被脱裤系列]2 还没深化数据库就浅出了

1 定位

主要从三个方面进行定位d Y !,用户的反应,日志记A ^ E载以及服务器内网监控。

  • 用户反应

用户是最直接的反应者,用户的反应是推向系统进一b K ` { h步优化的重要一步。

  • 服务器资源监控

尽量不要等着用户反应的时分手忙脚乱。一般项目中都会有一套比较完好的服务端监控系统,所谓”监控不到位,领导两行泪”。那监控一般都是哪些内容呢?服务器本身CPU,IO等基础方针以外,一般会通过访问趋势表展示服务整体的访问c 5 l s v量、照应供给时间情况,过错数量等。通过功能报表展示哪个资源或许服务出现问题。

[别被脱裤系列]2 还没深化数据库就浅出了
监控方针
  • 日志剖析

除了Linux! A l系统日志,还有数据库日志,根据他们定位问题地址。

[别被脱裤系列]2 还没深化数据库就浅出了
Linux日志

数据调优的几个方向

  • 数据库的选择

根据应用,事务的需求选择A Y * 0 p K P l 5不同的数据库。是否考虑事务,行存储仍是列存储等。

  • 优化表

(1& V o b ]) 假设查询剖析较多,可选用空间换时间的方法增加K 7 u z ? s = ~ z冗余字段前进查询功率。

(2) 不同字段的数据类型直接关系到查询功率的凹凸和存储的大小。

(0 ~3) 选用第三范式让结构愈加明晰,削P w } V ^ A – i减冗余字段。

  • 合理运用索引

(1) 不是索引越多越V 8 d 7 m好,索引也需占用存储空间,一起也会增加筛选索引的核算时间。

(2) 数据的重复度过高不宜运用索引。

(3) 索引列处于不同的方位对索引影响比较大。比如在WHERE子句中,对索引字段进行核算会形成索引失效。

  • 运用redis等作为缓存

缓存分为静态缓存,分布式缓存S 3 E } n N 3 & ),热点缓( w q存。”缓存”我的了解是解决不n $ k 8 ? f R同硬件速度的差异性,协调且充分利用硬件的资源。运用缓存的事例无处不在,不管是Linu= n [x内核处理TLB,仍是HTTP的缓存机制。总之许多当地都会通过运用缓存来前进访问速度,尽量减少和数据库的直接交互。

  • 库级优化

(1) 在读写都比较多情况下,通过选用读写分离的方法下降数据库的负载。] Q K L e | (

(2) 数据库的分库分表。切分数据库到多台服务器。

[别被脱裤系列]2 还没深化数据库就浅出了

2 索引的原理

索引看做字典的目录,根据目录能快速定位内容,不必从头到尾花费时间找。是不是加了索引便是起飞了?那是不一定的。

(1) 数据量小的情况,不t j L加索引

(2) 数据流大的B g u b情况,考虑加索引

索引的种类

(1)普通索引

没有捆绑

(2)仅有性索引

增加仅有性捆绑,D S # g W一张数据表能够多个仅有索引

(3)主键索引

在仅有性索引基础上,增加不为空的捆绑。

(4)全文索引

Mysql自带全文索引支撑英文,一般运用ES等替i T P 1 v 0

调集索引与非调集

(1) 调集索引

通过索引^ V 0 T n a方位直接找到需求的J ^ E 值。如下图

(2) 非调集索引

索引项次第存储,但是指向内容为随机。所以第一次找到索引,还需求第2次去找到索引对应的方位然后取出数据行。如下图所示。

(3) 两者不同点

  • 调集索引叶子节点寄存数据值。非调集索引叶子节点寄存数据行的方位
  • 一个表只能一个调集索引但是能够` A T有多个非调集索引
  • 调集索引查询功率高,非调集索引查询功率低q r n i } 6 ! !

合适加索引

  • 字段仅有性性质

我们知道仅有性索引和主键索引都具有仅有性的捆绑,假设某字段仅有则能够考虑

  • 需求常常Group by和ORDER by的情况
  • 索引是让数据依照T w + h H : |某种次第进行存储和检索。
  • distinct字段需求创建索引
[别被脱裤系列]2 还没深化数据库就浅出了

什么时分C b 4 w不需求创建索引

  • WHERE条件顶用不到的字段不需求创建索引
  • 表记载太少
  • 字段中大量重复
  • 一再更新的字段。更新字段也更新索引,索引多,更新索引的时分会成为担负。

失效的索引

  • 运用表达式比如EXPLAIN查看表实行计划时索引会失效

EXPLAIN SELECT na~ 8 F rme from..

  • 对索引运用函数也会失效
  • 运用”like”m 1 ; z W %进行模糊查询的时分不要运用”%”,否则也会失效

二叉树

二分查找是一种高效的检索方法,时E J J , t s d刻复杂度为O(log2n),但是在特其他情况退化为链表然后导致时间复杂度为o(n)。随后提出平衡二叉树的概念,但是二叉树中树的深度仍5 e 1 S Y B q T H是O(logO N d u C 3 !2n),数据查询依赖于磁盘IO,然后改造了M叉树。比如B树,关于一个1000阶的B树,只需求三层就能够存储1000Wa O f D 7 _的索引数据,因为高度比二叉树低许多。为了前进查询的稳定性,出现B+树。

这儿也就出现一个面试题

B树和B+树

  • B+树查询更稳定,因为在查询进程中都是在叶子节点才华找到数据。B树中非叶子节点也会存储数据
  • B+树更矮胖,查询时所需磁盘IO更少。相同的磁盘页,B+树能寄存更多节点, M [ y F T { x X关键字。

3 页结构

在数据库中~ 5 g G q y Q [ t,不管是读取一行仍是多行都是将地址的页进行加载。页是数据库处理存储的空间的基本单位。

在数据库中存在页,区,段等概念,他们之间的关系如下图所示。

[别被脱裤系列]2 还没深化数据库就浅出了
数据库页K 2 f T P f区段

从上图我们知道一个表空间存在多个段,其间一个段包含多个区,一个区存在多个页,每个页多行记载。那具体都是干啥的呢?

在Innodb中,一个b v ^ j v E n 差异配64接连的页,页大小I 5 V S / t T默认为16KB,所以一个区大小为64*16KB=1MB

段是由多个区组成,不同数据库方针不同段。创建一张表的2 K I 5 L ? z 9 l时分创建一个表段。创建索引则为索引段。

表空间

逻辑容器。其间包含许多段,但是一个段只能归于一个表空间。一个数据库由多个表空间组成,其间包含系统表空间,用户表空间等。

o e R据库IO操作最小R . { P | p s W单位为页。页的具体结构如下图所示。

[别被脱裤系列]2 还没深化数据库就浅出了

为了知道页中各个字段是什么意思,总结了一个图表如下

[别被脱裤系列]2 还没深化数据库就浅出了

上面的文件头和文= K ~ ~ G 7 S &件尾对页内容8 y I进行封装,通过校验的方法保证页的完好性。一起通过链表的方法将各个页衔接在一起。如下图所示。

[别被脱裤系列]2 还没深化数据库就浅出了

再看记载部分。其间记载部分X 1 n r包含了最大,最小记载和用户记载,其他还有可变的闲暇空间便当活络的分配新的记载。

[别被脱裤系列]2 还没深化数据库就浅出了

索引部分

在页中记载依照单链表的方法3 n 9 m V p / k *存储。我们知道单链表的插入和删去便当,但是查找就不是很有好了。所以在此引入页目录,页目录供给二分查找的方法前进记载的检索功率。那具体是怎么样的呢?

  • 先对A e N n l +记载分组,第一组只要一个记载,终究一组为最大记载
  • 每一组终究一条记载存储总共多g , $ b U少条记载J b :
  • 页目录存储终究一条记载的地址偏移量,也叫做槽,其指针指向组的终究一个记载。

假定查% M 1 v找键为6的用户,页目录下标从0开端,选用二分查找进行。0 F L } l F
(1) mid=(low+high)/2=1,此时取出槽1最大记载为4,4<6则在[mid,high) u z ] _ E]中? & c Y w寻找
(2) midH u p P # J u=(mid+high)/2=2,此时取出槽2最大记载为8,8>6,直接在槽2查^ . M x R找,遍历取出即可。

3 失望锁与豁达锁

锁运用到许多当地,我们熟知的多线程,线程同步等都可能用到锁,通过锁来调整运转次第和坚持B S B Z T l h &一致性。在数据库中,依照粒度划分为行锁,表锁和页锁。

(1) 行锁

利益:锁粒度较小,锁抵触概率小,并发度较高。缺陷:锁开支大,( 1 V ) M O ]简单出现死锁

(2) 页锁

从前面总结我们知道页中包含行,那么页锁数据资源比行锁多。开支在行和表锁之间,会出现死^ y } @ ( 锁。

(3) 表锁

利益:锁运用开支小,加锁快。缺陷:确认力度大,发生锁a ~ B抵触概率大。

从数据库的处理角度来差异,分为同享锁和M W q H f W c 5排它锁

(1) 同享锁

能够被用户读取,但是不能批改。

(2)排它锁

也叫做独占锁,写锁或许X 锁。只允许进行确认的事务运用,其他V P } ) 0事务无法对其批改或许查询 g R s e 4。所以我们在运用更新操作的时分,为了防止其他事物的更改,就会运用排它锁。

从开发者角度分为豁达锁与失望? y K m –

豁达锁:通过本身选用时间戳或许版本机制进行操控。失望锁:通过数据库本身机制保证数据操作的排他性

4 SQL剖析常B 6 y j d ` b用进程

(1) 检Y – ! c R 3 _ [查有没有出现有没有周期性的规矩,假设有能够考虑更新缓存的战略或许加缓存

(2) 假设不是,考虑是不是查询语句本身问题,然后剖析查询语句。之前介绍的几种查询优化的方法都能够测验。一起引入慢查询能够) y 4 V知道实行慢的f ( k c B + Q语句有哪些

(3) 找到了实行慢的语句就能够# k E ~ x )引入eJ ~ 2 – D sxpla. ; X Q 0 H C @ 4in查看SQL实行计划,通过expalin能够知道数据表读取次第,实践运用的索引,被优化行的数量等。

(4) 终究运用show profile了解实行本钱。默许是关着的,运用set ‘profiling’=”on”翻开。

这一篇就到结尾了,谢谢我们的查看,也费事我们文末点个赞。再会,下一期常见面试题汇总见。

[别被脱裤系列]2 还没深化数据库就浅出了