mysql优化面试总结

mysql优化 和 mysql优化之索引 两篇文章有大量的实验性的内容,我暂时没时间理解,把八股部分总结到这篇文章中,方便记忆

我们为什么要对sql进行优化

我们开发项目上线初期,由于业务数据量相对较少,一些SQL的执行效率对程序运行效率的影响不太明显,而开发和运维人员也无法判断SQL对程序的运行效率有多大,故很少针对SQL进行专门的优化;

而随着时间的积累,业务数据量的增多,SQL的执行效率对程序的运行效率的影响逐渐增大,此时对SQL的优化就很有必要。

sql性能下降原因

  1. 索引(单值索引、复合索引)失效
  2. 关联查询太多join(设计缺陷或不得已的需求)

数据库优化

读写分离

大型网站会有大量的并发访问,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢失的话,后果更是不堪设想。这时候,我们需要考虑如何减少数据库的联接。

我们发现一般情况对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,这样分析可以采用数据库集群的方案。其中一个是主库,负责写入数据,我们称为写库;其它都是从库,负责读取数据,我们称为读库。这样可以缓解一台服务器的访问压力

从库监听主库的二进制日志(保存着mysql中所有的写操作),主库发生改变,从库会执行一遍二进制日志。

在这里插入图片描述

数据库集群

如果访问量非常大,虽然使用读写分离能够缓解压力,但是一旦写操作一台服务器都不能承受了,这个时候我们就需要考虑使用多台服务器实现写操作。

例如可以使用MyCat搭建MySql集群,对ID求3的余数,这样可以把数据分别存放到3台不同的服务器上,由MyCat负责维护集群节点的使用。

数据库表的优化

表拆分

表结构越大,查询效率越低。

  1. 将表垂直拆分,拆分的是表结构。
  2. 将表水平拆分,拆分的是表的数据量。
    在这里插入图片描述

其他

  1. 为列选择合适的数据类型(尽量选择占据空间小的数据类型)

    • 在varchar和char中选择时,应尽量选择char,定长字段查询比可变长度字段快,简言之就是空间换时间
      同时VARCHAR的长度只分配真正需要的空间

    • 能用TINYINT就不用SMALLINT,能用SMALLINT就不用INT,磁盘和内存消耗越小越好

    • 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
      这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

  2. 在可以确定只存在一个查询结果或者判断库中有无符合条件数据时,时间limit 1来限定查询结果,limit 1会在查询到一条信息后停止查询返回结果,而不是继续往后查询下一条符合条件的数据,既使用select 1 from table where condition limit 1,来代替select count

  3. 尽量将表字段定义为NOT NULL约束,这时由于在MySQL中含有空值的列很难进行查询优化,NULL值会使索引以及索引的统计信息变得很复杂。

  4. 单表不要有太多字段,建议在20以内

  5. 在合适的场景使用反范式。

  6. mysql分区(todo 这个不明白,有机会再说)

    使用分区是大数据处理后的产物。比如系统用户的注册推广等等,会产生海量的日志,当然也可以按照时间水平拆分,建立多张表。但在实际操作中,容易发生忘记切换表导致数据错误。
    分区适用于例如日志记录,查询少。一般用于后台的数据报表分析。对于这些数据汇总需求,需要很多日志表去做数据聚合,我们能够容忍1s到2s的延迟,只要数据准确能够满足需求就可以。

    MySQL主要支持4种模式的分区:range分区、list预定义列表分区,hash 分区,key键值分区

数据库优化面试题

执行数据库查询时,如果要查询的数据有很多,假设有1000万条,用什么办法可以提高查询速率?

在这里插入图片描述
在这里插入图片描述

  • 数据库设计
  1. 建立索引
  2. 拆分表
  3. 使用合适的字段,例如将varchar换成char
  4. 多表关联查询设置冗余字段
  • 在SQL语句方面:
  1. 优化SQL语句,减少比较次数;
  2. 使用limit进行分页查询
  • 其他
  1. 使用缓存
  2. 读写分离,主备集群

什么是分库分表?什么时候进行分库分表?有没有配合es使用经验?

这块儿暂时先不看,因为微服务本身就是分库分表的,在这儿想表达的意思是在微服务已经分库分表的情况下,在各微服务继续分库分表么?等有时间再来看这个

这里暂时只做一个简短的介绍,并没有深入,没时间

分库分表的代价是很高的,如果没有在项目中有深刻的体会的话,尽可能和面试官先说,数据量比较大的话可以先尝试一下其他的方案去存储、优化查询,尽量先不去做分库分表的操作。

分库分表的操作意味着性能的急剧下降和后续sql执行的复杂度会直线上升。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

索引优化

索引官方定义:索引是帮助mysql高效获取数据的数据结构。

索引的目的在于提高查询效率

可以简单理解为:排好序的快速查找的数据结构

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这种数据结构以某种方式(引用)指向数据。
这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。

例如将id加索引,在mysql数据库里开辟一块存储空间来存放索引数据,查询的时候如果根据id去查询,就要走这个索引库,在索引库找到之后,就能定位这条数据,因为索引库的每一项和数据库的物理地址是绑定的,你能找到这条索引,就能找到这条数据所对应的物理地址,就可以直接获取这条数据。

在这里插入图片描述
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。

索引结构

我们平常所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。
其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认都是使用B+树索引,统称索引。
当然,除了B+树这种类型的索引外,还有哈希索引等。

BTree索引、hash索引、full-text全文索引、R-Tree索引,我们只关注BTree索引

B+Tree(B+)索引检索原理(mysql默认的索引结构)

在这里插入图片描述
在这里插入图片描述

索引的优缺点

  • 优点
  1. 提高数据检索的效率,降低数据库的io成本
  2. 通过索引列对数据进行排序,降低数据排序的成本,降低了cpu的消耗
  • 缺点
  1. 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的
    索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
  2. 虽然索引大大提高了查询速度,却会降低更新表的速度,如对表进行增删改。
    因为更新表时,mysql不仅要保存数据,还要更新添加了索引列的字段,也会调整因为更新所带来的键值变化后的索引信息

什么时候需要/不需要创建索引?

需要创建索引

  • 频繁作为查询条件的字段应该创建索引
  • 查询中排序、统计、分组的字段

不需要创建索引

  • 表记录太少
  • 更新非常频繁的字段不适合创建索引
    除了更新数据本身外还需要更新BTree树,数据量大的话是很耗费资源的。
  • 唯一性太差(字段好多都是同一个值)(在查询的时候会索引失效)的字段不适合单独(可以使用联合索引)创建索引,即使频繁作为查询条件;

索引能够极大的提高数据检索效率,也能够改善排序分组操作的性能,但是我们不能忽略的一个问题就是索引是完全独立于基础数据之外的一部分数据,更新数据会带来的IO量和调整索引所致的计算量的资源消耗。

避免索引失效

索引失效导致的结果就是全表扫描

  1. 遵守最左匹配原则
    如果是复合索引(索引了多列),就要遵守最左匹配原则,
    指的是查询从索引的最左列开始并且不跳过中间索引中的列
    如果跳过了,最左边的列依然会走索引,右边的列就不会走索引了
  2. 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
  3. 在使用!=或者<>无法使用索引会导致全表扫描,可以使用union all
  4. is null 和 is not null 也无法使用索引,可以设置default值,避免null值
  5. like以通配符开头 例如%abc ,索引失效导致全表扫描
    如果在实际业务中必须把%放在前面,我们可以使用覆盖索引
    使用覆盖索引查询时,只查询覆盖索引中的一个字段或全部,都会用到索引
  6. 少用or,会引起索引失效
    少用 in 和 not in,因为in 实际上等同于 or
  7. 唯一性太差,会引起索引失效。(例如一个字段有好多内容是相同的)

只是我常常觉得很多话无从说起。就像在平时,见到一些陌生人,一些熟悉和欢喜的人,不知道与之说些什么。也很少对身边的人谈论自己。所有的时间和记忆,都可以交付给书写。不可能再说得更多。有些在书中说过多次,却似乎并未说出真正想表达的意思。有些从无提起过,它们在黑暗中更显得郑重端庄。有些事是不能轻易说起的。书写可以,但那也是不足够的。

素年锦时
安妮宝贝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/599609.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实现同一份数据的各种镜像

一个数据集通过某个轴&#xff08;通常是垂直或水平轴&#xff09;的镜像对称。这可以通过简单的数学运算来实现。 如果想要通过一块数据生成四份&#xff0c;可以通过以下步骤&#xff1a; 下面是一个简单的示例&#xff0c;展示了如何通过垂直轴&#xff08;左右对称&#…

HCIP的学习(13)

第五章&#xff0c;重发布和路由策略 重发布 ​ 在路由协议的边界设备上&#xff0c;将某一种路由协议的路由信息引入到另一种路由协议中&#xff0c;这个操作被称为路由引入或者路由重分发。----技术本质为重发布。 条件 必须存在ASBR设备&#xff08;路由边界设备&#x…

VMware虚拟机提示内存不足

VMware虚拟机&#xff0c;k8s集群搭建内存不足的问题 疑问&#xff1a;我的电脑是8G8G双通道的内存&#xff0c;当我在搭建k8s集群时给master-2G内存&#xff0c;node1-3G内存&#xff0c;node2-3G内存&#xff1b; 当依次打开虚拟机到node2时VM提示“物理内存不足&#xff0c;…

Python-100-Days: Day11 Files and Exception

1.读取csv文件 读取文本文件时&#xff0c;需要在使用open函数时指定好带路径的文件名&#xff08;可以使用相对路径或绝对路径&#xff09;并将文件模式设置为r&#xff08;如果不指定&#xff0c;默认值也是r&#xff09;&#xff0c;然后通过encoding参数指定编码&#xf…

PTA|小字辈

题目 本题给定一个庞大家族的家谱&#xff0c;要请你给出最小一辈的名单。 输入格式&#xff1a; 输入在第一行给出家族人口总数 N&#xff08;不超过 100 000 的正整数&#xff09; —— 简单起见&#xff0c;我们把家族成员从 1 到 N 编号。随后第二行给出 N 个编号&#x…

JAVA语言VUE2+Spring boot+MySQL开发的智慧校园系统源码(电子班牌可人脸识别)Saas 模式

技术栈 1. 开发语言&#xff1a;JAVA 2. 数据库&#xff1a;MySQL 3. 后端框架&#xff1a;Spring boot 4. 前端框架&#xff1a;VUE2 5. 电子班牌&#xff1a; Android 7.1 6. 小程序&#xff1a;原生开发 7. 多学校Saas 模式 电子班牌是一款智慧校园管理工具&#xf…

Java实现手机短信验证码(互亿无线)

互亿无线 互亿无线是一家提供电信类增值服务插件以及其他相关插件的公司&#xff0c;是中国移动、中国联通、中国电信三大运营商的战略合作伙伴与工信部认定的电信增值业务服务商。公司旗下运营三大业务平台&#xff1a;数字奖励营销活动平台、应用短信平台、营销短信平台。 官…

上网行为审计软件分享|三款热门上网行为监控软件推荐

“小王&#xff0c;去找一款软件给我们公司安上&#xff0c;你去搜上网行为审计软件&#xff0c;看看买哪家合适” 这是某公司老板交给助理的一项工作&#xff0c;原话是这样的。 可见其实这类软件大多是人还是比较陌生的。 上网行为审计软件顾名思义就是对上网行为也就是电…

04-22 周日 阿里云-瑶光上部署FastBuild过程(配置TLS、自定义辅助命令)

04-22 周日 阿里云-瑶光上部署FastBuild过程 时间版本修改人描述2024年4月22日14:18:59V0.1宋全恒新建文档2024年4月23日20:41:26V1.0宋全恒完成了基本流程的添加 简介 前提 准备两台服务&#xff0c;一台部署Docker&#xff0c;一台部署FastBuild的镜像容器服务所述的Docke…

落地企业业财一体化的关键能力和路径

在财务数字化的改革过程中&#xff0c;财务部门已经通过会计电算化、ERP、财务共享&#xff0c;基本实现业务财务流程拉通和财务运营效率的提升&#xff0c;接下来面临问题是如何通过构建业财一体化体系&#xff0c;进一步挖掘数字利用价值&#xff0c;为管理决策赋能。 但在业…

LLM应用-prompt提示:让大模型总结生成Mermaid流程图;充当角色输出

1、prompt提示让大模型总结生成Mermaid流程图 生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 …

国内如何下载TikTOK,手机刷机教程

最近很多玩家都来问怎么刷机&#xff1f;手机环境怎么搭建&#xff1f;这里给大家整理了苹果IOS刷机教程 1.iOS下载教程 &#xff1a; 步骤一&#xff1a;手机调试 苹果手机系统配置推荐&#xff1a;iPhone6S以上&#xff0c;16G。 注意&#xff1a;如果是选择购入二手手机…

Devin AI程序员是如何设计出来的

背景 Devin是一个能够执行复杂工程任务并与用户在软件开发项目上积极合作的自主人工智能软件工程师&#xff0c;它擅长planning、tool use、reflecting&#xff0c;碾压大部分初级开发。 设计思路 一、界面设计 先来看 Devin 的界面&#xff0c;左边是对话框&#xff0c;记…

C++笔记之调用PCL库显示PCD文件的点云

C++笔记之调用PCL库显示PCD文件的点云 —— 2024-05-05 杭州 code review! 文章目录 C++笔记之调用PCL库显示PCD文件的点云1.运行2.点云pcd文件github下载地址2.main.cpp3.CMakeLists.txt1.运行 2.点云pcd文件github下载地址 https://github.com/luolaihua/point-cloud-data-…

如果insightface/instantID安装失败怎么办(关于InsightFaceLoader_Zho节点的报错)

可能性有很多&#xff0c;但是今天帮朋友解决问题的时候又收集了一种新的思路。 首先&#xff0c;可以先按照这篇文章里边提到的方法去安装&#xff1a; 【全网最详细】ComfyUI下&#xff0c;Insightface安装指南-聚梦小课堂_insightface如何安装-CSDN博客 其次&#xff0c;…

牛客周赛 Round 41 C-F

C 小红的循环移位 思路&#xff1a; 一个数是不是四的倍数&#xff0c;只用看最后两位是否能够整除4即可。 #include <bits/stdc.h>using namespace std; const int N 1e6 5; typedef long long ll; typedef pair<ll, ll> pll; typedef array<ll, 3> p3;…

IP规划案例

整个OSPF环境IP基于172.16.0.0/16划分 172.16.0.0/16 先分成2个网段&#xff08;OSPF RIP&#xff09;&#xff0c;借1位172.16.0.0/17 ---OSPF 再按区域划分&#xff08;5个区域&#xff09;&#xff0c;借3位 172.16.0.0/20 ---Area 0 三个环回 MGRE 4个网…

京东工业优选商品详情API接口:解锁高效工业采购新体验

京东工业优选的商品详情API接口&#xff0c;允许开发者通过程序化的方式&#xff0c;快速获取平台上的商品详细信息。这些详细信息包括但不限于商品名称、价格、规格、库存、图片、评价等&#xff0c;为企业提供全方位的商品信息查询服务。 二、API接口的主要功能 实时查询&a…

练习项目后端代码解析注解篇(annotation)

前言 本来想从接口处入手的&#xff0c;但是一下看到接口里几十个方法&#xff0c;眼睛有点抗拒&#xff0c;想想还是先看作者写的自定义注解吧。 项目里有三个自定义注解&#xff1a; 分别是AccessLimit注解、OperationLogger注解、VisitLogger注解 AccessLimit注解 这是一…