文章目录

  • 前言
  • 一、MySQL的底层原理粗解
    • 1.1 MySQL的底层运作
    • 1.2 MySQL的存储方式
  • 二、索引(重点内容)
    • 2.1 索引是什么?
    • 2.2 MySQL调优到底是调啥的
    • 2.3 如何创建一个索引
      • 2.3.1在创建表的时候创建索引
      • 2.3.2 通过更新语句来创建索引
    • 2.4 索引的底层原理
        • 2.4.1 使用二叉树来进行模拟索引底层(淘汰)
      • 2.4.2 使用红黑树(平衡二叉树)树来进行模拟索引底层(淘汰)
      • 2.4.3 使用B树来进行模拟索引底层(淘汰)
      • 2.4.4 使用B +树来进行模拟索引底层(选用)
    • 3 聚集索引与非聚集索引的介绍
  • 3. Explain关键字的使用
    • 3.1 Explain的介绍
  • 总结

前言

对于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. MySQL调优篇:单机数据库如何在高并发场景下健步如飞?

    在当前的IT开发行业中,系统访问量日涨.并发暴增.线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代中一个炙手可热的名词,无论是在开发.面试过程中,性能优化都是一个常谈常新的话题.而MySQL作为整 ...

  2. MySQL调优是程序员拿高薪的必备技能?

    前言 有一句很有意思的话:现在的世界,得数据者得天下. 可见数据对于我们.对于企业.对于未来发展来说都十分重要. 而想要"得天下",掌握海量数据,那么对存储.读写数据的数据库的要求 ...

  3. 什么叫精通MySQL调优

    MySQL调优对于很多程序员而言,都是一个非常棘手的问题,多数情况都是因为对数据库出现问题的情况和处理思路不清晰.在进行MySQL的优化之前必须要了解的就是MySQL的查询过程,很多的查询优化工作实际 ...

  4. MySQL调优篇 | SQL调优实战(5)完结篇

    [前言] 经常有一些朋友向我咨询,如何写出高效的SQL,这不是三言两语能说得清的,索性认真来写一下,增删查改方面的知识我不再赘述,如果有基础薄弱的同学,可以好好的补一补再来看. 以MySQL为基础,M ...

  5. 开发人员MySQL调优-实战篇2-让SQL使用索引详解

    2019独角兽企业重金招聘Python工程师标准>>> 建议先看看开发人员MySQL调优-实战篇0 让执行的SQL使用索引 虽然DBA给我们建了很多索引,但没有经验的开发人员往往只看 ...

  6. MySQL调优系列基础篇

    前言 有一段时间没有写博客了,整天都在忙,上班,录制课程,恰巧最近一段时间比较清闲,打算弄弄MYSQL数据库. 关于MySQL数据库,这里就不做过多的介绍,开源.免费等特性深受各个互联网行业喜爱,尤其 ...

  7. Mysql调优你不知道这几点,就太可惜了

    转载自  Mysql调优你不知道这几点,就太可惜了 一.Mysql的逻辑分层 Mysql分为:连接层.服务层.引擎层.存储层. 当客户端向服务端发起操作请求的时候,执行过程是这样的: 1.客户端端与M ...

  8. MySQL 调优/优化的 101 个建议!

    转载自 MySQL 调优/优化的 101 个建议! MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议.有些技巧适 ...

  9. MySQL(用户管理,常用sql语句,数据库备份恢复,MySQL调优,恢复误操作数据)...

    一.MySQL用户管理. 一个MySQL数据库里可以跑多个库,总不能给所有人的程序员root用户,则可以给他们单独的用户访问数据库. 创建用户:(grant all on *.* to 'user1' ...

  10. 面试中sql调优的几种方式_面试方式

    面试中sql调优的几种方式 The first question I ask someone in an interview for a cybersecurity position is, &quo ...

最新文章

  1. Android记录24-WebView实现白天/夜间阅读模式
  2. 第16讲:ODBCJDBC简介
  3. oracle 查看并行数据库,Oracle数据库并行查询出错的解决方法
  4. 怎么把模组直接装在Java里面_如何使用jythonj将python模块添加到java中
  5. 关于actionbar的drawerlayout
  6. matlab 取43阶上部分,求教关于matlab四阶累积量函数里变量的意义。
  7. C++ 11 深度学习(九)C++文件IO
  8. springboot : Failed to decode downloaded font 和 OTS parsing error
  9. python爬虫 点击下一页_python爬虫实现获取下一页代码
  10. python编写命令行框架_使用 Python 和 Click 编写命令行应用程序
  11. 5.4使用Mockito to mock来测试
  12. ImageNet下载资源(2017年)
  13. 蓝牙键鼠 HID Reports
  14. Mir2源码详解之服务端-选择(角色)网关(SelGate)
  15. 软件工程导论E-R图、盒图(N-S图)、PAD图
  16. SwiftUI 人工智能教程之图像识别植物或花朵通过图片和相机
  17. 微软官方的精简版Windows 7——Windows Thin PC
  18. JavaScript的map方法
  19. 相关性指标RMSE/PLCC/SROCC/KROCC理解
  20. 可扩展标记语言XML之一:XML的概念、作用与示例

热门文章

  1. 第一行代码 第二版pdf及源码(分享)
  2. 再生核希尔伯特空间(RKHS)和核函数
  3. Linux解压缩.tar.bz2
  4. 混音师的混音之道|处理母带和混音的差别?母带处理的真相(上)|MZD Studios
  5. 荔枝软件如何测试声音,荔枝如何测自己的声音 荔枝测自己的声音方法
  6. USB协议分析方法,工具推荐
  7. 苹果越狱后怎么还原_iOS 软件证书失效怎么办?越狱后你可以这么做
  8. 图片轮播html原生代码,原生js实现轮播图的示例代码
  9. android 查看cad方案,android 加载dwg 图纸解决方案
  10. Uiautomator 2.0之UiObject2类学习小记