草庐IT

面试之MySQL调优问题

sugar-free->小粽子 2023-10-10 原文

文章目录

前言

对于MySQL调优问题是作为一个后端开发者经常在面试的时候被面试官问到的高频率问题,其中主要是对MySQL的底层进行一个掌握程度的一个了解,现将自己最近的一些总结经验记录下来作为一个提升训练。


一、MySQL的底层原理粗解

1.1 MySQL的底层运作

1、MySQL文件底层是基于文件系统的操作方式————故此可以说明其底层就是I/O操作
2、那么影响I/O操作的因素是什么呢?(在这里我们以常用的查询操作为例)————磁盘的“旋转”与磁盘的“寻道”,通过磁盘的“旋转”与磁盘的“寻道”这种方式最终去找到这个数据,这个才是决定我们MySQL性能上优劣的基础。
3、通常情况之下磁盘的旋转时间是很短的,影响我们查询的真正因素是磁盘的寻道(就是要找到我们这个数据到底应该读取哪一个区间的数据 这个才是最耗时的)

1.2 MySQL的存储方式

对于我们熟悉的MySQL来说我们都知道它的引擎的是innodb,因此我们的MySQL在保存我的表的整体数据的时候就会有两个文件

.frm文件中保存的是表的结构
.ibd文件中保存的是数据和索引方式

如果是MyISAM存储引擎的话那么我们的表的整体数的保存至少是三个文件
一个文件用来保存 表结构
一个文件用来保存 数据
一个文件用来保存 索引
顺带一提:MyISAM是MySQL的默认数据库引擎(5.5版之前)由早期的ISAM所改良。虽然性能极佳,但却有一个缺点:不支持事务处理(transaction),因此呢MyISAM存储引擎与Innodb存储引擎是不一样的。

二、索引(重点内容)

2.1 索引是什么?

问题:在MySQL中存在索引吗?
回答:存在,在每一个表结构中可以看到,其次在MySQL中的Innodb引擎下会默认为主键创建索引的。

平时:记得我第一次与索引打交道的时候是在学Java数组里面的知识的时候学到的,当时自己作为一个小白刚入门只知道索引就类似于一个标志,对它的了解非常的片面。

MySQL中的索引:在MySQL的索引中我们应该用一种新的认知来了解这个概念,因为他不同于我们之前认识的那种粗略的概念,在MySQL中如果将MySQL存储的数据比作一本字典的话,那么索引就相当于于查询该字典数据的一种方式,回想一下我们在查询字典的时候,我们可以通过查询目标字的拼音或者部首偏旁来进行查找,而我们的索引就相当于于这两种方式中的一种。

试想一下,如果是一本庞大的字典的话当我们在没有索引或者是说没有查找方式的情况下去查找一个字我们只能通过一页一页地翻去查找它,那是有多麻烦,效率非常地低下。(tips:如果这样我觉得我宁可当一个文盲~~)
综上所述:可知索引对于MySQL查找来说是多么的重要,今天的MySQL调优也是围绕这个“索引”主角来开展的。

2.2 MySQL调优到底是调啥的

1、基于硬件级别的调优:
MySQL本身的一些配置参数 my,cnf 这个调优是跟硬件有关系的一般是由运维工程师进行调优。
2、基于MySQL本身的SQL语句的调优
这个调优是由我们开发者自己来完成的,所以我们的调优是让我们的SQL语句尽量走“索引”然后提高效率这个就是我们的调优目的。(但是不是每一次走索引的方式都是最佳的)

2.3 如何创建一个索引

2.3.1在创建表的时候创建索引

CREATE TABLE <表名字>(
id int primary key auto_increment,
userName varchar(200),
password varchar(200),
INDEX(username)#使用 index关键字进行索引的创建,括号中也可以写多个需要创建索引的字段名字
)

2.3.2 通过更新语句来创建索引

#如果给多个字段创建索引 那么成为联合索引
ALTER TABLE t_user ADD INDEX(username,password);#使用DDL语句来进行修改

#如果创建的索引是一个字段的 那么称为单值索引
ALTER TABLE t_user ADD INDEX (user_name)

2.4 索引的底层原理

示例:用一列数据来创建索引:1、2、3、4、5、6 分别测试使用二叉树、红黑树、B树以及B+Trees树来进行排序

2.4.1 使用二叉树来进行模拟索引底层(淘汰

图例:

缺点:如果我们需要使用的数据本身是有序的话,那么如果此时我们需要对9999999个有序数据进行排序,那么将会成为一条链的单向树,
这样一来当我们需要查询这第9999999个数据的时候那么就需要遍历9999999次数据,这样做不仅浪费时间而且在存储的时候会造成存储的节点过多。
时间性价比上效果就会显得很差!!!

2.4.2 使用红黑树(平衡二叉树)树来进行模拟索引底层(淘汰

图例:

首先,我们得承认使用红黑树的话的确比使用二叉树的效率要高很多。
其次,红黑树本身也是一种二叉树,只不过是一种比较特殊的二叉树
二叉树如果插入的数值是有序时,二叉树就是非平衡的,基本跟链表类似了(时间复杂度O(N))
针对这种情况,就产生了红黑树,这种树在插入的过程中,会通过一系列的方式来保持树的平衡,使其时间复杂度一直维持在O(logN)
总结:
在以上案例之中,假设现在我们要遍历6个有序的数据,二叉树需要遍历6次,红黑树遍历4次就搞定了,但是缺点也有,
当我们需要进行遍历的数据量过大的时候并且这些数据有大小顺序的话,节点依然还是很多,如果有999999个数据的话通过计算下来仍然还是需要遍历很多次,
简而言之,虽然红黑树的遍历效率比二叉树要好一些,但是它们两个在根本上还是没能解决掉遍历大量数据的时候所面临的问题(需要进行查找的次数太多了)。


2.4.3 使用B树来进行模拟索引底层(淘汰

图例:

首先,我们要知道B树有一个叫作“深度”的概念,表示这个节点最多存储的数据(可以手动设置),
每一个节点最多能够存储(深度-1)个数据,这样就可以在遍历的时候减少我们的遍历次数,从而
提高效率。当我们将深度设置为7的时候那么显然一个节点就能够存储于完所有的数据(6个数据)
这样一来,B树的的确确是非常优秀适合用来做索引的底层结构的。
但是!!!!,B树有一个致命缺点,那就是它并不擅长做范围内的查询,因为范围内的查询还是需要遍历很多结点的。

2.4.4 使用B +树来进行模拟索引底层(选用

图例:

	最终我们选用B+Tree的原因
	1、所有的数据都存放到了叶子节点上
	2、以牺牲数据存储冗余空间为代价换去咱们这个时间
	3、规避了B树不擅长范围内查询的这个缺点
	4、叶子节点上的所有节点之间存在的都是“双向链表”这样一来就便于我们的查找了

这里有个小疑问:
	当索引列的值为null,那么这个数据存在何处呢?
	答:存在叶子节点的“最左侧”。

问题与漏洞:
	如果存在很多的null会造成什么结果?
	答:如果存在很多的null列,它根本就无法通过上面的冗余节点来判断这个数据所在的空间,
	最直接的结果就是效率很低,甚至造成索引失效的后果。因此面试题会告诉你,索引列的字段最好不要为空,否则会造成索引失效。

3 聚集索引与非聚集索引的介绍

非聚集索引
在MyISAM这个存储引擎下 我们的索引的值 是这一条数据的物理地址
聚集索引
是指的是 INNODB下 主键索引的键值主键 主键索引的值 是当前的整条数据
二级索引的键是索引列的字段 二级索引(除了主键索引之外的其他索引 都叫做二级索引)的值 是主键

面试题:是不是索引越多越好?
不是 索引本身的数据在你进行数据库的增删改的时候要同步而同步的话也是需要消耗性能的。所有说如果随便创建索引过多不但不能提高效率 反而可能降低效率

3. Explain关键字的使用

3.1 Explain的介绍

使用Explain关键字可以模拟优化器来执行SQL语句,分析你的查询语句或者是结构性的性能瓶颈在select语句之前增加Explain关键字,MySQL就会在查询上设置一个标记,执行查询会返回执行计划的信息,而不是一个查询结果。
如果from中包含子查询,仍会执行该子查询,将结果放入到临时表中。

实例如下:

关键字段说明:其中的type字段就是用来展示该SQL所采用的方式是什么,其中选用的All方式,是一种效率最低的方式,说明这条语句需要进行优化。

效率优劣排序:system>const>eq_ref>ref>range>index>ALL
一般来说要保证查询达到range级别算是最好的了,最好达到ref级别。

面试高频率部分:
这个表很重要建议熟记:

总结

以上便是对MySQL调优中需要注意的知识点和如何调优的方法的一个归纳与总结。后期可能会有补充部分,由于我目前尚学较浅,后期会进行补充。

有关面试之MySQL调优问题的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  3. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  4. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  5. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  8. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  9. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  10. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

随机推荐