数据库分库分表--前奏篇

数据库分库分表--前奏篇

数据库和表的演变

单库单表

项目前期基本都是单库单表,单库单表也是最常见的数据库设计。比如说:有一张用户表User,被放到数据库中,所有的用户的信息都被存储在该数据库的这张User表里。

单库多表

随着用户量的增加,User表的数据越来越多,一旦当数据量达到一定量的时候,对User表的查询会变得越来越慢,从而渐渐的影响整个数据的性能。有时候可能涉及到需要对User表添加一列,如果Mysql版本较低的话,这时候Mysql会锁表,会导致所有的读写操作只能等待添加操作完毕。

这时候可以通过某种机制或者规则将表里的数据进行拆分。比如说:user_id是0到10000的放到User_01表里,将user_id是10001到20000的用户信息放到User_02表里,......。这些表组合起来就是一个系统完整用户信息。

多库多表

随着用户数据量的不断增加,单台数据库的存储空间也许就不够用了,并且随着查询量的不断增加,单台数据库的服务已经没法支撑这些查询了,因为表的数据量太大,所以在增加和减少索引时需要消耗很长时间。这时候可以针对User_01,User_02,....User_10放到一个数据库里,User_11,User_12,...User_20放到一个数据库里.....这样就之前的一个数据库,拆分成了n多个数据库。那时候表和数据库就从单表单库到了多表多库了。

何为分开分表

由于用户数据量不断的增加,我们怎样存储这些数据呢?要怎样才能让系统不会因此而受到影响呢?

目前,数据拆分是这两个问题的主流解决方案。最终目的就是讲用户数据进行分而治之,在数据库存储方面是通过对数据库和表进行分库分表来实现,对数据的拆分主要有两种手段:垂直拆分水平拆分

垂直拆分

根据业务的维度,将原本的一个库或者表拆分成多个库或者表,每个库或者表的结构和原来的结构有所不同。

比如说:之前的数据库里除了用户的信息表User以外,可能还有交易表等。而现在按照垂直拆分后,用户信息放在一个库,交易信息放一个库。

水平拆分

根据分片算法,将一个数据或者表拆分成多个库或者多个表,每个库和表保留着原来的结构。

比如说:一个库拆分成多个库后,每个库里也是有用户的信息表、交易表的结构都是一样的,只是数据存的不一样了。

上面的两种拆分方式可以根据实际需求选择合适的方案。

在什么情况下需要咱们进行分库分表呢

首先,如果在一个库中的表数据超过了一定的数量,可以理解为阈值。比如说:在Mysql的表中达到千万级别数据就需要考虑分库分表(这个千万也是相对的,和你的表设计还是有些关系的),这样,数据就被分散在不同的表上,单表的索引大小得到控制,会提升查询性能的,对索引以及表结构的变更会更加方便和高效的。当数据库实例的吞吐量达到性能瓶颈的时候,我们需要扩展数据库实例,让每个数据库实例承担其中一部分数据库的请求,分解大量请求带来的整体压力。

现在,大多数数据库实例都可以创建多个数据库,那么为什么在分库分表中要创建多数据库呢?因为如果扩容时候有多个数据库,则只要通过DBA的操作,就可以将不同的数据库移动到不同的数据库实例中,在应用层不用对数据和表的配置进行变更,只需要增加对实例的引用。

下面总结一下在什么情况下需要分库分表?

  1. 如果在数据库中的表中的数据量达到一定程度或者是阈值,则需要进行分库分表,分解单表的大数据量对索引查询带来的压力,并方便对索引和表结构进行变更。
  2. 如果数据库的吞吐量达到瓶颈了,就需要增加数据库实例,利用多个数据库实例来分解大量的数据请求带来的系统压力。
  3. 如果希望在扩容时候对应用层的配置改变最少,就需要在每个数据实例中预留足够的数据库数量。

Read more

决策树算法介绍:原理与案例实现

决策树算法介绍:原理与案例实现

决策树算法介绍:原理与案例实现 决策树算法介绍:原理与案例实现 一、决策树算法概述 决策树是一种基本的分类与回归方法,它基于树形结构进行决策。决策树的每一个节点都表示一个对象属性的测试,每个分支代表该属性测试的一个输出,每个叶节点则代表一个类别或值。决策树学习通常包括三个步骤:特征选择、决策树的生成和决策树的剪枝。 二、决策树算法原理 1. 特征选择 特征选择是决策树学习的核心。它决定了在树的每个节点上选择哪个属性进行测试。常用的特征选择准则有信息增益、增益比和基尼不纯度。 * 信息增益:表示划分数据集前后信息的不确定性减少的程度。选择信息增益最大的属性作为当前节点的测试属性。 * 增益比:在信息增益的基础上考虑了属性的取值数量,避免了对取值数量较多的属性的偏好。 * 基尼不纯度:在CART(分类与回归树)算法中,使用基尼不纯度作为特征选择的准则。基尼不纯度越小,表示纯度越高。 2. 决策树的生成 根据选择的特征选择准则,从根节点开始,递归地为每个节点选择最优的划分属性,并根据该属性的不同取值建立子节点。直到满足停止条件(如所有样本属于同一类,

By Ne0inhk
他给女朋友做了个树莓派复古相机,算法代码可自己编写,成本不到700元

他给女朋友做了个树莓派复古相机,算法代码可自己编写,成本不到700元

手机拍照不够爽,带个单反又太重? 试试做个树莓派复古相机,还能自己编写处理算法的那种—— 成本不到700元。 没错,颜值很高,拍出来的照片也能打: 你也可以快速上手做一个。 如何制作一个树莓派复古相机 目前,这部相机的代码、硬件清单、STL文件(用于3D打印)和电路图都已经开源。 首先是硬件部分。 这部复古相机的硬件清单如下: 树莓派Zero W(搭配microSD卡)、树莓派高清镜头模组、16mm 1000万像素长焦镜头、2.2英寸TFT显示屏、TP4056微型USB电池充电器、MT3608、2000mAh锂电池、电源开关、快门键、杜邦线、3D打印相机外壳、黑色皮革贴片(选用) 至于3D打印的相机外壳,作者已经开源了所需的STL文件,可以直接上手打印。 材料齐全后,就可以迅速上手制作了~ 内部的电路图,是这个样子的: 具体引脚如下: 搭建好后,整体电路长这样: 再加上3D外壳(喷了银色的漆)和镜头,一部简易的树莓派复古相机就做好了。 至于软件部分,

By Ne0inhk
🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

🚀Zeek.ai一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器

是一款基于 Electron 和 Vite 打造的跨平台(支持 Windows、macOS 和 Linux) AI 浏览器。 集成了 SearXNG AI 搜索、开发工具集合、 市面上最流行的 AI 工具门户,以及代码编写和桌面快捷工具等功能, 通过模块化的 Monorepo 架构,提供轻量级、可扩展且高效的桌面体验, 助力 AI 驱动的日常工作流程。

By Ne0inhk
LibreChat 集成 Stripe 支付的奶妈级教程

LibreChat 集成 Stripe 支付的奶妈级教程

我们假设你已经熟悉基本的 React 和 Node.js 开发,并且正在使用 LibreChat 的默认技术栈(React 前端、Node.js 后端、Vite 构建工具,可能还有 Electron 桌面应用)。教程会特别考虑 Electron 环境下的适配问题(例如 macOS 中文路径或路由错误)。“奶妈级”带你从零开始实现支付功能(包括一次性支付和添加高级会员订阅) 教程目标 * 在 LibreChat 中添加支付页面,支持用户通过信用卡付款。 * 实现 Stripe 的一次性支付功能。 * (可选)扩展到订阅功能,管理高级会员状态。 * 解决 Electron 环境下的常见问题(如路由和路径解析)。 * 生成可公开推送的 Markdown 教程,方便社区参考。 前提条件 在开始之前,请确保你已准备好以下内容:

By Ne0inhk