mysql基础知识篇(六)

news2024/11/25 4:42:18

1.如何分库?

  • 垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。

在这里插入图片描述

  • 水平分库:以字段为依据,按照一定策略(hash、range 等),将一个库中的数据拆分到多个库中。

2.如何分表?

  • 水平分表:以字段为依据,按照一定策略(hash、range 等),将一个表中的数据拆分到多个表中。
  • 垂直分表:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。
    在这里插入图片描述

3.水平分表有哪几种路由方式?

什么是路由呢?就是数据应该分到哪一张表。

水平分表主要有三种路由方式:

范围路由:选取有序的数据列 (例如,整形、时间戳等) 作为路由的条件,不同分段分散到不同的数据库表中。
我们可以观察一些支付系统,发现只能查一年范围内的支付记录,这个可能就是支付公司按照时间进行了分表。
在这里插入图片描述
范围路由设计的复杂点主要体现在分段大小的选取上,分段太小会导致切分后子表数量过多,增加维护复杂度;分段太大可能会导致单表依然存在性能问题,一般建议分段大小在 100 万至 2000 万之间,具体需要根据业务选取合适的分段大小。

范围路由的优点是可以随着数据的增加平滑地扩充新的表。例如,现在的用户是 100 万,如果增加到 1000 万,只需要增加新的表就可以了,原有的数据不需要动。范围路由的一个比较隐含的缺点是分布不均匀,假如按照 1000 万来进行分表,有可能某个分段实际存储的数据量只有 1000 条,而另外一个分段实际存储的数据量有 900 万条。

  • Hash 路由:选取某个列 (或者某几个列组合也可以) 的值进行 Hash 运算,然后根据 Hash 结果分散到不同的数据库表中。

同样以订单 id 为例,假如我们一开始就规划了 4 个数据库表,路由算法可以简单地用 id % 4 的值来表示数据所属的数据库表编号,id 为 12 的订单放到编号为 50 的子表中,id 为 13 的订单放到编号为 61 的字表中。
在这里插入图片描述
Hash 路由设计的复杂点主要体现在初始表数量的选取上,表数量太多维护比较麻烦,表数量太少又可能导致单表性能存在问题。而用了 Hash 路由后,增加子表数量是非常麻烦的,所有数据都要重分布。Hash 路由的优缺点和范围路由基本相反,Hash 路由的优点是表分布比较均匀,缺点是扩充新的表很麻烦,所有数据都要重分布。

  • 配置路由:配置路由就是路由表,用一张独立的表来记录路由信息。同样以订单 id 为例,我们新增一张 order_router 表,这个表包含 orderjd 和 tablejd 两列 , 根据 orderjd 就可以查询对应的 table_id。
    配置路由设计简单,使用起来非常灵活,尤其是在扩充表的时候,只需要迁移指定的数据,然后修改路由表就可以了。
    在这里插入图片描述
    配置路由的缺点就是必须多查询一次,会影响整体性能;而且路由表本身如果太大(例如,几亿条数据) ,性能同样可能成为瓶颈,如果我们再次将路由表分库分表,则又面临一个死循环式的路由算法选择问题。

4.不停机扩容怎么实现?

实际上,不停机扩容,实操起来是个非常麻烦而且很有风险的操作,当然,面试回答起来就简单很多。

第一阶段:在线双写,查询走老库

  • 建立好新的库表结构,数据写入久库的同时,也写入拆分的新库
  • 数据迁移,使用数据迁移程序,将旧库中的历史数据迁移到新库
  • 使用定时任务,新旧库的数据对比,把差异补齐
    在这里插入图片描述
    第二阶段:在线双写,查询走新库
  • 完成了历史数据的同步和校验
  • 把对数据的读切换到新库
    在这里插入图片描述
    第三阶段:旧库下线
  • 旧库不再写入新的数据
  • 经过一段时间,确定旧库没有请求之后,就可以下线老库
    在这里插入图片描述

5.常用的分库分表中间件有哪些?

  • sharding-jdbc
  • Mycat

6.那你觉得分库分表会带来什么问题呢?

从分库的角度来讲:

事务的问题
使用关系型数据库,有很大一点在于它保证事务完整性。

而分库之后单机事务就用不上了,必须使用分布式事务来解决。

跨库 JOIN 问题
在一个库中的时候我们还可以利用 JOIN 来连表查询,而跨库了之后就无法使用 JOIN 了。

此时的解决方案就是在业务代码中进行关联,也就是先把一个表的数据查出来,然后通过得到的结果再去查另一张表,然后利用代码来关联得到最终的结果。

这种方式实现起来稍微比较复杂,不过也是可以接受的。

还有可以适当的冗余一些字段。比如以前的表就存储一个关联 ID,但是业务时常要求返回对应的 Name 或者其他字段。这时候就可以把这些字段冗余到当前表中,来去除需要关联的操作。

还有一种方式就是数据异构,通过 binlog 同步等方式,把需要跨库 join 的数据异构到 ES 等存储结构中,通过 ES 进行查询。

从分表的角度来看:

跨节点的 count,order by,group by 以及聚合函数问题
只能由业务代码来实现或者用中间件将各表中的数据汇总、排序、分页然后返回。

数据迁移,容量规划,扩容等问题
数据的迁移,容量如何规划,未来是否可能再次需要扩容,等等,都是需要考虑的问题。

ID 问题
数据库表被切分后,不能再依赖数据库自身的主键生成机制,所以需要一些手段来保证全局主键唯一。

  • 还是自增,只不过自增步长设置一下。比如现在有三张表,步长设置为 3,三张表 ID 初始值分别是 1、2、3。这样第一张表的 ID 增长是 1、4、7。第二张表是 2、5、8。第三张表是 3、6、9,这样就不会重复了。
  • UUID,这种最简单,但是不连续的主键插入会导致严重的页分裂,性能比较差。
  • 分布式 ID,比较出名的就是 Twitter 开源的 sonwflake 雪花算法

7.百万级别以上的数据如何删除?

关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的 IO,会降低增/改/删的执行效率。

所以,在我们删除数据库百万级别数据的时候,查询 MySQL 官方手册得知删除数据的速度和创建的索引数量是成正比的。

  • 所以我们想要删除百万数据的时候可以先删除索引
  • 然后删除其中无用数据
  • 删除完成后重新创建索引创建索引也非常快

8.百万千万级大表如何添加字段?

当线上的数据库数据量到达几百万、上千万的时候,加一个字段就没那么简单,因为可能会长时间锁表。

大表添加字段,通常有这些做法:

  • 通过中间表转换过去
    创建一个临时的新表,把旧表的结构完全复制过去,添加字段,再把旧表数据复制过去,删除旧表,新表命名为旧表的名称,这种方式可能回丢掉一些数据。

  • 用 pt-online-schema-change
    pt-online-schema-change是 percona 公司开发的一个工具,它可以在线修改表结构,它的原理也是通过中间表。

  • 先在从库添加 再进行主从切换
    如果一张表数据量大且是热表(读写特别频繁),则可以考虑先在从库添加,再进行主从切换,切换后再将其他几个节点上添加字段。

9.MySQL 数据库 cpu 飙升的话,要怎么处理呢?

排查过程:

(1)使用 top 命令观察,确定是 mysqld 导致还是其他原因。

(2)如果是 mysqld 导致的,show processlist,查看 session 情况,确定是不是有消耗资源的 sql 在运行。

(3)找出消耗高的 sql,看看执行计划是否准确, 索引是否缺失,数据量是否太大。

处理:

(1)kill 掉这些线程 (同时观察 cpu 使用率是否下降),

(2)进行相应的调整 (比如说加索引、改 sql、改内存参数)

(3)重新跑这些 SQL。

其他情况:

也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等。

参考书籍(访问密码: 6798):

深入浅出MySQL++数据库开发、优化与管理维护+第2版+唐汉明.pdf: https://url31.ctfile.com/f/40632231-735785515-c1ff5b?

高性能MySQL(第3版).pdf: https://url31.ctfile.com/f/40632231-735785459-780d3e?

SQL查询的艺术.pdf: https://url31.ctfile.com/f/40632231-735785297-8c1d65?

MySQL技术内幕 InnoDB存储引擎 第2版.pdf:https://url31.ctfile.com/f/40632231-735784839-1a2df2?

SQLite 权威指南.pdf: https://url31.ctfile.com/f/40632231-735784840-d76185?

MySQL必知必会.pdf:https://url31.ctfile.com/f/40632231-735784664-7f7ca8?

MongoDB权威指南.pdf:https://url31.ctfile.com/f/40632231-735784624-2dafdf?

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线代 | 【提神醒脑】自用笔记串联三 —— 相似对角化 · 二次型 · 合同变换

本文总结参考于 kira 2023 线代提神醒脑技巧班。 笔记均为自用整理。加油!ヾ(◍∇◍)ノ゙ 九、相似对角化 9.1、矩阵相似的性质 ----------------------------------------------------------------------------------------------------------…

Linux 网络编程项目 —— FTP 网盘

文章目录项目简介知识点描述项目功能指令远程功能指令本地功能指令使用的关键函数access 函数popen 函数chdir 函数strtok 函数strncmp 函数linux system函数是否执行成功判断方法基本流程服务端客户端FTP代码实例头文件 ftp.h客户端 client.c服务端 server.cV2.0版 – 启用副服…

如何实现虹科物联网HMI/网关的调度器功能?

一、前言 JMobile软件提供了一个调度器引擎,通过设定的时间计划表自动执行特定动作,从而赋予HMI/网关调度器功能,减少现场操作人员的工作压力。本文主要介绍如何实现JMobile软件的调度器功能。 二、工具 1. Windows PC 2. JMobile Studio…

《论文阅读》DeepSFM: Structure From Motion Via Deep Bundle Adjustment

留个笔记自用 DeepSFM: Structure From Motion Via Deep Bundle Adjustment 做什么 首先是最基础的,Structure-from-Motion(SFM),SFM可以简单翻译成运动估计,是一种基于dui8序列图片进行三维重建的算法。简单来说就…

C++11(三)可变模板参数、lambda表达式、包装器

🧸🧸🧸各位大佬大家好,我是猪皮兄弟🧸🧸🧸 文章目录一、可变模板参数1.通过递归推导参数包2.通过列表初始化推导参数包二、emplace三、lambda表达式1.lambda表达式语法2.使用lambda3.捕捉列表说…

phpstorm+wamp在线调试wordpress

简介 本文源自公司内部使用wordpress搭建了一套官网,经常有定制化的需求,有些插件实现不了,需要通过phpstorm调试的方式熟悉wordpress,同时修改php代码,本地测试环境window,适合用wamp作为php运行环境&…

解放你的双手----WIN7设置自动化任务

近期在使用双屏工具DualMonitor的时候遇到一个问题,每次电脑锁屏超过一定时常之后,登录解锁该软件虽然在运行但是功能失效了,需要手动关闭打开该程序,一时也没找到有效的解决方法和替代软件,于是就想着能不能在我登录解…

数据存储——存储图像

图像数字化(一)图像数字化1.图像采样2.数字图像的技术指标3.编码(三)数字图像的分类1.光栅图2.矢量图总结:图像数字化的过程(一)图像数字化 按一定空间间隔,自左至右,自…

面试系列Spring:SpringMVC的工作流程

核心组件: DispatcherServlet:前端控制器,负责调度其他模块执行,核心模块 Handler:处理器,完成具体的业务逻辑,相当于Servlet HandlerMapping:处理器映射器,DispatcherSe…

[世界杯]根据赔率计算各种组合可能性与赔率

目录 一、背景 二、数据输入 2.1 赔率示意图 2.2 代码 三、数据处理 3.1 计算各种组合可能性 3.2 修正概率 四、输出结果 一、背景 本文以世界杯体彩“混合过关”4场串胜平负为的赔率进行编码 其他类型如比分 、总进球数可以参考代码进行相应修改 需要的库&#xff…

Web3中文|区块链游戏的成长之痛

来源 | cointelegraph 编译 | DaliiNFTnews.com 在过去十年中,手机游戏已成为互动娱乐产业的重要支柱,得益于智能手机的普及,来自世界各地的用户都成为了硬核游戏玩家。 现在,区块链技术的出现正在推动一种范式的转变&#xff…

基于SSM的在线书城网站【附源码】

一、项目功能 1.前台功能 图书基本展示,包括推荐图书展示和类图书类型展示.推荐图书包括条幅推荐,热销推荐和新品推荐.按照图书类型展示商品.图书详细信息展示.图书加入购物车.修改购物车内图书信息,例如数量等.用户登录.用户注册.修改个人信息,包括密码和收获信息.购物车付款…

环状序列(逐行解析)(保姆式解析)(算法竞赛入门经典二)

环状序列长度为n的环状串有n种表示法&#xff0c;分别为某个位置开始顺时针得到。例如&#xff0c;图中的环状串有10种表示&#xff1a; CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中&#xff0c;字典序最小的称为“最小表示”。 输入一个长度为n(n<100)的环状DNA串…

leetcode 526. 优美的排列(回溯)

题目链接&#xff1a;526. 优美的排列 回溯 树型结构: 预处理 matchmatchmatch 数组&#xff08;每个位置符合条件的数有哪些&#xff09;&#xff1a; void getMatch(int n) {used.resize(n 1);match.resize(n 1);for (int i 1; i < n; i) {for (int j 1; j < n…

供应双功能螯合剂THP-Mal,THP 马来酰亚胺,CAS:1314929-99-1

一&#xff1a;产品描述 1、名称 THP-Mal THP Maleimide THP 马来酰亚胺 2、CAS编号&#xff1a;1314929-99-1 3、分子式&#xff1a;C44H57N9O13 4、分子量&#xff1a;919.41 5、外观&#xff1a;白色或者灰白色粉末 6、沸点&#xff1a;1389.365.0 C(Predicted) …

内网穿透无法访问本地wordpress网站

解决办法:在wordpress主目录下修改wp-config.php文件 增加2行代码。 define(WP_SITEURL, http:// . $_SERVER[HTTP_HOST]); define(WP_HOME, http:// . $_SERVER[HTTP_HOST]); 增加2代码的意思&#xff1a;设置网站域名为当前访问的域名&#xff0c;也就是取消了域名的绑定。…

Linux下 生成coredump文件前配置

一. Linux下coredump文件 在 Linux 系统下&#xff0c;存在一种 coredump机制。 Linux 系统下&#xff0c;在进行 C/C 开发时&#xff0c;经常会遇到程序运行突然崩溃的问题。这时可以通过离线调试即 coredump 方式进行 bug 的定位。 具体为当程序出现段错误时&#xff0c;内…

用匠心创造可期未来!与广州流辰信息科技一起携手创佳绩!

当今社会世界经济一体化趋势逐渐明朗化&#xff0c;竞争也愈发激烈&#xff0c;同时&#xff0c;这也是一个机遇与挑战并存的开放社会。在机遇面前&#xff0c;作为企业&#xff0c;要紧紧抓住机遇&#xff0c;顺势而为&#xff0c;创造辉煌佳绩&#xff1b;在挑战面前&#xf…

Hostlink读写寄存器报文分析

引言 Hostlink是欧姆龙PLC默认的串口上行通信协议&#xff0c;使用默认的通信协议可免除PLC端的配置工作&#xff0c;易于实现分工协作。下面以CP1E-E的PLC为例进行说明&#xff0c;CP系列的PLC规则都是一样的。 读离散量 请求报文 字节流 40 33 31 46 41 30 30 30 30 30 3…

[Jetson]在nvidia orin/xavier上快速配置深度学习环境(Tensorflow,Pytorch都可以参考)

本文章将介绍如何通过docker在边缘计算设备nvidia orin/xavier上快速配置深度学习环境.该方法适用于Tensorflow,Pytorch,但是本文以介绍Tensorflow的安装为主. 文章目录第一步:安装docker第二步:安装nvidia-docker2第三步:拉取tensorflow镜像3.1 确定容器版本3.2 拉取镜像3.3 测…