数据库优化的几个阶段

2023-11-01

 

引言

大家在面试的时候,是否遭遇过,面试官询问

你们是如何进行数据库优化的?

那这个问题应该怎么答呢?其实写这个题材的原因是我这几天看到各公众号转的一篇数据库调优的知识(不上链接了),我就稍微翻了几下,上面动不动就来说要对数据库进行水平拆分,我就想反问各位读者,你们几个人经历过水平拆分?现在很多文章,实践性实在太差,只能说纯理论分析。
这篇文章最早来自知乎的一个提问,我在其基础上完善了一下。

第一阶段 优化sql和索引

这才是调优的第一阶段啊,为什么呢?


因为这一步成本最低啊,不需要加什么中间件。你没经过索引优化和SQL优化,就来什么水平拆分,这不是坑人么。

步骤是什么样呢?我说个大概

(1)用慢查询日志定位执行效率低的SQL语句
(2)用explain分析SQL的执行计划
(3)确定问题,采取相应的优化措施,建立索引啊,等

我就不举例了,因为如何优化SQL的文章,一抓一大把,再贴过来,读者看着也累。

第二阶段 搭建缓存

在优化sql无法解决问题的情况下,才考虑搭建缓存。毕竟你使用缓存的目的,就是将复杂的、耗时的、不常变的执行结果缓存起来,降低数据库的资源消耗。

这里需要注意的是:搭建缓存后,系统的复杂性增加了。你需要考虑很多问题,比如:

第三阶段 读写分离

缓存也搞不定的情况下,搞主从复制,上读写分离。在应用层,区分读写请求。或者利用现成的中间件mycat或者altas等做读写分离。

需要注意的是,只要你敢说你用了主从架构,有三个问题,你要准备:

(1)主从的好处?
回答:实现数据库备份,实现数据库负载均衡,提高数据库可用性
(
2)主从的原理?
回答:如图所示(图片不是自己画的,偷懒了)

 


主库有一个log dump线程,将binlog传给从库
从库有两个线程,一个I/O线程,一个SQL线程,I/O线程读取主库传过来的binlog内容并写入到relay log,SQL线程从relay log里面读取内容,写入从库的数据库。

 

(3)如何解决主从一致性?

回答:这个问题,我不建议在数据库层面解决该问题。根据CAP定理,主从架构本来就是一种高可用架构,是无法满足一致性的。

哪怕你采用同步复制模式或者半同步复制模式,都是弱一致性,并不是强一致性。所以,推荐还是利用缓存,来解决该问题。

步骤如下:

1、自己通过测试,计算主从延迟时间,建议mysql版本为5.7以后,因为mysql自5.7开始,多线程复制功能比较完善,一般能保证延迟在1s内。不过话说回来,mysql现在都出到8.x了,还有人用5.x的版本么。
2、数据库的写操作,先写数据库,再写cache,但是有效期很短,就比主从延时的时间稍微长一点。
3、读请求的时候,先读缓存,缓存存在则直接返回。如果缓存不存在(这时主从同步已经完成),再读数据库。

第四阶段 利用分区表

说句实在话,你们面试的时候,其实可以略过这个阶段。因为很多互联网公司都不建议用分区表,我自己也不太建议用分区表,采用这个分区表,坑太多。

这里引用一下其他文章的回答:

什么是mysql的分区表?


回答:所有数据还在一个表中,但物理存储根据一定的规则放在不同的文件中。这个是mysql支持的功能,业务代码不需要改动,但是sql语句需要改动,sql条件需要带上分区的列。

缺点

(1)分区键设计不太灵活,如果不走分区键,很容易出现全表锁
(2)在分区表使用ALTER TABLE … ORDER BY,只能在每个分区内进行order by
(3)分区表的分区键创建索引,那么这个索引也将被分区。分区键没有全局索引一说。
(4)自己分库分表,自己掌控业务场景与访问模式,可控。分区表,研发写了一个sql,都不确定该去哪个分区查,不太可控。
…不列举了,不推荐

第五阶段 垂直拆分

上面四个阶段都没搞定,就来垂直拆分了。垂直拆分的复杂度还是比水平拆分小的。将你的表,按模块拆分为不同的小表。大家应该都看过《大型网站架构演变之路》,这种类型的文章或者书籍,基本都有提到这一阶段。

如果你有幸能够在什么运营商、银行等公司上班,你会发现他们一个表,几百个字段都是很常见的事情。所以,应该要进行拆分,拆分原则一般是如下三点:

(1)把不常用的字段单独放在一张表。
(2)把常用的字段单独放一张表
(3)经常组合查询的列放在一张表中(联合索引)。

第六阶段 水平拆分

OK,水平拆分是最麻烦的一个阶段,拆分后会有很多的问题,我再强调一次,水平拆分一定是最最最最后的选择。从某种意义上,我觉得还不如垂直拆分。因为你用垂直拆分,分成不同模块后,发现单模块的压力过大,你完全可以给该模块单独做优化,例如提高该模块的机器配置等。如果是水平拆分,拆成两张表,代码需要变动,然后发现两张表还不行,再变代码,再拆成三张表的?水平拆分后,各模块间耦合性太强,成本太大,慎重。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库优化的几个阶段 的相关文章

随机推荐

  • 2021年5月19日 Centos8 安装yapi 全过程 亲自实践有效

    环境要求 centos8 nodejs 7 6 mongodb 2 6 安装nodejs 有一个前期 确保你的yum是可以用的 yum module list nodejs sudo yum module install nodejs no
  • C#如何定义位(Bit)

    StructLayout LayoutKind Explicit Size 16 CharSet CharSet Ansi public class Flag FieldOffset 0 public ushort ReserveBits
  • KEIL中的 USE_STDPERIPH_DRIVER 宏定义

    在项目中使用stm32标准外设库 STM32F10x Standard Peripherals Library 的时候 我们会在项目的选项中预定义两个宏定义 USE STDPERIPH DRIVER STM32F10X MD 如下图 这两个
  • 前端常见跨域解决方案

    什么是跨域 跨域是指一个域下的文档或脚本去请求另一个域下的资源文档 根据浏览器同源策略 同源是指 协议 域名 端口都相同 有一个不同都会产生跨域行为 跨域解决方案 JSONP 通常为了减轻web服务器的负载 我们把js css img等静态
  • 【趣味JavaScript】我的天! 居然工作了5年的前端开发都不知道eval函数其中居然暗藏玄机!

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 eval 函数介绍 首先你要知道在JS中eval 函数是用来干嘛的 它主要的功能就是
  • node_modules/XXX/index.js:XXX;XX

    这个语法是 ECMAScript 2021的语法 还挺新的 对node版本要求会比较高 这里这个 icon this options icon level 意思就是 如果this options icon level 拿得到值 就等于它 否
  • 谷粒商城基础班

    4 分布式组件 SpringCloud Alibaba简介 注册中心 配置中心 网关 结合SpringCloud Alibaba我们最终的技术搭配方案 SpringCloud Alibaba Nacos 注册中心 服务发现 注册 Sprin
  • 第十四届蓝桥杯.子串简写(前缀和\后缀和)

    程序猿圈子里正在流行一种很新的简写方法 对于一个字符串 只保留首尾字符 将首尾字符之间的所有字符用这部分的长度代替 例如internationalization简写成 i18n Kubernetes 简写成 K8s Lanqiao 简写成
  • 解决finalshell无法连接,一直提示登陆密码

    问题描述 在使用FinalShell连接配置虚拟机时 无法正常连接 一直提示输入登录密码 即使输入的密码是正确的 解决方案 直接从虚拟机内打开终端 切换至root用户 进入配置文件修改内容 admin localhost su root 密
  • BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding学习

    一 什么是BERT模型 谷歌团队的Thang Luong直接定义 BERT模型开启了NLP的新时代 BERT这个模型与ELMo和OpenAI的fine tune transformer的不同的是 它在训练双向语言模型时以减小的概率把少量的词
  • 如何在基于wamp环境的PhpStorm导入项目并成功运行(本地服务器)【全程图片教程】

    在wamp PhpStorm成功安装后如何导入已有的PHP项目文件并运行 据作者近日查阅资料发现 网络上关于phpstorm导入项目方面教程甚少且相对零散 故作此教程 过程由作者综合网络上教程得来 某些地方不知原理 只知如何操作 如有知道原
  • 自定义属性 declare-styleable数据类型简介:

    一 reference 参考指定Theme中资源ID 1 定义 1 2 3
  • ORA-14074: partition bound must collate higher than that of the last partition

    1 创建分区表create table zhanglei test c1 number c2 varchar2 10 partition by range c1 partition p10 values less than 10 parti
  • 【实战详解】如何快速搭建接口自动化测试框架?Python + Requests

    摘要 本文主要介绍如何使用Python语言和Requests库进行接口自动化测试 并提供详细的代码示例和操作步骤 希望能对读者有所启发和帮助 前言 随着移动互联网的快速发展 越来越多的应用程序采用Web API 也称为RESTful API
  • pypi上如何上传自己的python代码并使用

    1 下载一个叫做twine的库 上传的时候会用到 pip install i https pypi douban com simple twine 2 新建一个python package的包 包的名字就是你上传代码的名字 我这里上传代码的
  • 服务器扫描发现漏洞-可通过HTTP获取远端WWW服务信息

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 可通过HTTP获取远端WWW服务信息 Microsoft IIS 7 5 漏洞描述 本插件检测远端HTTP Server信息 这可能使得攻击者了解远程系统类型以便进行下一步
  • VAE 代码实现

    参考原文 https shenxiaohai me 2018 10 20 pytorch tutorial advanced 02 本文附带jupyter notebook文件已上传到我的CSDN资源中 1 导入模型训练相关包 import
  • __attribute__ 之weak,alias属性

    原文地址 http blog sina com cn s blog a9303fd90101d5su html Weak Alias 跟 Weak Reference 完全没有任何关系 不过是我在看到 Weak Reference的时候想到
  • HTML入门-------form表单

    一 表单概述 表单是可以把用户输入的数据传输到服务器端的HTML元素 然后在后台处理表单传输过来的数据 用来完成与用户之间的各种交互动作 在网页上由可输入的表单控件 比如文本输入框 密码输入框 单选按钮 多选按钮等 表单在网页中主要负责收集
  • 数据库优化的几个阶段

    引言 大家在面试的时候 是否遭遇过 面试官询问 你们是如何进行数据库优化的 那这个问题应该怎么答呢 其实写这个题材的原因是我这几天看到各公众号转的一篇数据库调优的知识 不上链接了 我就稍微翻了几下 上面动不动就来说要对数据库进行水平拆分 我