MySQL分库分表

k8s架构、工作流程、集群组件详解 Kubernetes(简称K8s,是因为 k 和 s 之间有八个字符)是一个开源的容器编排平台,用于管理云平台中多个主机上的容器化应用程序。它提供了一种机制,用于自动化部署、扩展和管理容器化应用程序的集群。Kubernetes的目标是让部署容器化应用程序变得简单高效。它提供了应用程序部署、规划、更新和维护的基本机制,同时具备强大的扩展性和可靠性。Kubernetes采用主从设备模型(Master-Slave架构),其中Master节点负责核心的调度、管理和运维任务,而Slave节点负责运行应用程序的容器。 阅读详情

一、分表

在日常开发或维护中经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。

1. 什么是分表

分表是将一个大表按照一定的规则分解成多张的实体表,我们可以称为子表。对于myisam引擎,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。根据分表技术对海量数据的优化方式目前有2种方法。

1.1 垂直分割

把一个数据量很大的表,可以把不同的列划分到不同的子表中,子表的结构各不相同。垂直分割的理由一般是根据数据的活跃度进行分离,不同活跃的数据,处理方式是不同的。

垂直分割

【案例】

  • 对于一个博客系统,文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,我们把它叫做冷数据。
  • 而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据/热数据。

所以,在进行数据库结构设计的时候,就应该考虑分表,首先是纵向分表的处理。

(1)数据库引擎的选择

这样纵向分表后:首先存储引擎的使用不同,冷数据使用MyIsam 可以有更好的查询效果;活跃数据,可以使用Innodb ,可以有更好的更新速度。

(2)读写优化

其次,对冷数据进行更多的从库配置,因为更多的操作是查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。

(3)热数据加缓存

其实,对于一些特殊的活跃数据,也可以考虑使用memcache、redis之类的缓存,等累计到一定量再去更新数据库。或者mongodb 一类的nosql 数据库,这里只是举例,就先不说这个。


1.2 水平分割

根据一列或者多列的值把数据行放到多个独立的子表里,字表的结构相同。水平分表方式可以通过多个低配置主机整合起来,实现高性能。分表理由:保证单表的容量不会太大,从而来保证单表的查询等处理能力。

水平分割

下面要介绍的“分表”主要指水平分表。


2. 利用merge存储引擎实现分表

2.1 步骤

假如我有一张用户表user,有50W条数据,现在要拆成二张表user1和user2,每张表25W条数据。

(1)新建子表

mysql> CREATE TABLE IF NOT EXISTS `user1` (  
 ->   `id` int(11) NOT NULL AUTO_INCREMENT,  
 ->   `name` varchar(50) DEFAULT NULL,  
 ->   `sex` int(1) NOT NULL DEFAULT '0',  
 ->   PRIMARY KEY (`id`)  
 -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  
Query OK, 0 rows affected (0.05 sec)  

mysql> CREATE TABLE IF NOT EXISTS `user2` (  
 ->   `id` int(11) NOT NULL AUTO_INCREMENT,  
 ->   `name` varchar(50) DEFAULT NULL,  
 ->   `sex` int(1) NOT NULL DEFAULT '0',  
 ->   PRIMARY KEY (`id`)  
 -> ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  
Query OK, 0 rows affected (0.01 sec)  

(2)往子表里插入数据

INSERT INTO user1(user1.id,user1.name,user1.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id <= 250000

INSERT INTO user2(user2.id,user2.name,user2.sex)SELECT (user.id,user.name,user.sex)FROM user where user.id > 250000

(3)建立merge表

mysql> CREATE TABLE IF NOT EXISTS `alluser` (  
 ->   `id` int(11) NOT NULL AUTO_INCREMENT,  
 ->   `name` varchar(50) DEFAULT NULL,  
 ->   `sex` int(1) NOT NULL DEFAULT '0',  
 ->   INDEX(id)  
 -> ) TYPE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST AUTO_INCREMENT=1 ;  
Query OK, 0 rows affected, 1 warning (0.00 sec)  

(4)备份user表,然后删除它

(5)把这个alluser表的表名改成user


2.2 注意事项

(1)一个 merge 表不能在整个表上维持 unique 约束。当你执行一个 insert,数据进入第一个或者最后一个 myisam 表(取决于 insert_method 选项的值)。mysql 确保唯一键值在那个 myisam 表里保持唯一,但不是跨集合里所有的表。

(2)当你创建一个 merge 表之时,没有检查去确保底层表的存在以及有相同的机构。当 merge 表被使用之时,mysql 检查每个被映射的表的记录长度是否相等,但这并不十分可靠。如果你从不相似的 myisam 表创建一个 merge 表,你非常有可能撞见奇怪的问题。


3. 常用的分表策略

上面介绍的分表其实是对表结构进行了更改,对大表进行拆分。实际上我们在设计数据库表结构和业务逻辑的时候,就应该计算业务需求,提前做好分表,避免大表的出现。下面是基于业务层面的一些常用分表策略。下面以新闻发布系统举例。下面分离出的子表可以位于一个数据实例上,如果位于不同的实例上那么就存在分库了,也就多了表与库的映射这一步。

(1)按时间结构

类似:

article_201701
article_201702
article_201703

在这个系统中,主键是13位带毫秒的时间戳

(2)归档式

类似:

article_old
article_new

一张是旧文章表,一张是新文章表,新文章表放2个月的信息,每天定期把2个月中的最早一天的文章归入旧表中。

(3)按版块结构

news_category
news_article
sports_category
sports_article

(4)按哈希结构

md5取前两位哈希可以达到1296张表,如果觉得不够,那就再加一位,总数可达46656张表。


二、分区

1. 什么是分区?

分表是逻辑层面的分割,分区是物理层面、存储层面的分割。准确来说,分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表。

mysql分表和分区有什么联系呢?
(1)都能提高mysql的性高,在高并发状态下都有一个良好的表现。
(2)分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式。

(3)merge这种分表方式,不能和分区配合。
(4)表分区相对于分表,操作方便,不需要创建子表。


2. 分区的类型

2.1 Range

把连续区间按范围划分:

create table user(
    id int(11),
    money int(11) unsigned not null,
    date datetime
)
partition by range(YEAR(date))(
    partition p2014 values less than (2015),
    partition p2015 values less than (2016),
    partition p2016 values less than (2017),
    partition p2017 values less than maxvalue
);

2.2 List

把离散值分成集合,按集合划分,适合有固定取值列的表

create table user(
    a int(11),
    b int(11)
)
partition by list(b)(
    partition p0 values in (1,3,5,7,9),
    partition p1 values in (2,4,6,8,0)
);

2.3 Hash

随机分配,分区数固定:

create table user(
    a int(11),
    b datetime
)
partition by hash(YEAR(b))
partitions 4;

2.4 Key

类似Hash,区别是只支持1列或多列,且mysql提供自身的Hash函数

create table user(
    a int(11),
    b datetime
)
partition by key(b)
partitions 4;

3. 分区管理

(1)新增分区

ALTER TABLE sale_data
ADD PARTITION (PARTITION p201710 VALUES LESS THAN (201711));

(2)删除分区

当删除了一个分区,也同时删除了该分区中所有的数据。

ALTER TABLE sale_data DROP PARTITION p201710;

(3)分区的合并
下面的SQL,将p201701 - p201709 合并为3个分区p2017Q1 - p2017Q3:

ALTER TABLE sale_data
REORGANIZE PARTITION p201701,p201702,p201703,
p201704,p201705,p201706,
p201707,p201708,p201709 INTO
(
PARTITION p2017Q1 VALUES LESS THAN (201704),
PARTITION p2017Q2 VALUES LESS THAN (201707),
PARTITION p2017Q3 VALUES LESS THAN (201710)
);
R语言机器学习算法实战系列(十一)MLP算法分类器 (Multi-Layer Perceptrons) 本文介绍了多层感知器(MLP)分类算法的原理和计算步骤,并通过R语言实现MLP模型。MLP是一种前馈神经网络,包含输入层、隐藏层和输出层,通过激活函数引入非线性,利用前向传播和反向传播进行训练。文章详细描述了数据预处理、数据切割、模型构建、预测和评估等步骤,并提供了乳腺癌数据集(BreastCancer_clean.csv)的下载链接。通过R包如neuralnet和caret,读者可以逐步实现MLP模型,并评估其分类性能。 阅读详情

相关推荐

【win11+vs 2017+OpenCV4.5.5+Qt5.12配置】详细安装过程+小问题解决

由于Qt5无法与最新的vs2022兼容,扩展工具中一直显示不可用,所以将vs降级成vs2017。在安装Qt的过程中,会选择安装Qt套件,其中就的MCVS 2017,说明vs2017是与qt兼容的。当然也可以用qt creator这一原生IDE。OpenCV版本目前是最新的4.8.0,使用过程中没有什么问题,但是还是安装低版本大概率避免一些玄学问题。

qq_45306739的博客 3350

数据库相关中间件收录集

数据库中间件 这里主要介绍互联网行业内有关数据库的相关中间件。数据库相关平台主要解决以下三个方面的问题: 为海量前台数据提供高性能、大容量、高可用性的访问 为数据变更的消费提供准实时的保障 高效的异地数据同步 应用层通过分表分库中间件访问数据库,包括读操作(Select)和写操作(update, insert和delete等,D...

weixin_33923762的博客 2万+

从Blender舞步到夜空画卷:基于Pix飞控的无人机编队灯光秀全链路开发实践

本文详细介绍了基于Pixhawk飞控的无人机编队灯光秀全链路开发实践。从Blender三维动画设计、QGroundControl地面站二次开发与MAVLink通信桥接,到PX4飞控的OFFBOARD模式路径控制与LED灯光驱动实现,最后通过Gazebo仿真验证并完成真机组装与首飞。文章为无人机爱好者提供了一套完整的、从创意设计到夜空执行的开源解决方案,重点阐述了多机同步与灯光控制的核心技术挑战与应对策略。

zeta9的博客 584

分布式数据库中间件对比总结 数据库(分库分表)中间件对比

分布式数据库中间件对比总结2016年08月28日 11:19:22阅读数:11082摘要:目前数据库中间件有很多,基本这些中间件在下都有了解和使用,各种中间件优缺点及使用场景也都有些心的。所以总结一个关于中间件比较的系列,希望可以对大家有帮助。 分布式数据库中间件对比总结(1)目前数据库中间件有很多,基本这些中间件在下都有了解和使用,各种中间件优缺点及使用场景也都有些心的。所以总结一个关于中间件比...

许恒的博客 1万+

Palantir的本体论建模跟数仓建模的异同

Palantir的Foundry Ontology通过构建组织的数字孪生体,将数据集和模型映射为对象类型、属性、链接和操作类型,形成完整的语义知识网络。与传统数仓建模相比,本体建模以业务问题为驱动,强调细粒度语义和实时决策能力,采用图语义技术实现灵活的映射关系。

轩哥的个人研究和成长记录 1588

【华为OD机试】创建二叉树(python, java, c++, js)

请按下列描达构建一颗二叉树,并返回该树的根节点: 1、先创建值为-1的根结点,根节点在第0层; 2、然后根据operations依次添加节点: operations[i] = [height, index] 表示对第 height 层的第index 个节点node, 添加值为i 的子节点: 若node 无「左子节点」。则添加左子节点; 若node 有「左子节点」但无「右子节点」,则添加右子节点: 否则不作任何处理。 height、index 均从0开始计数;index 指所在层的创建顺序。

A_D_I_D_A_S的博客 188

深入理解分库、分表、分库分表

分库分表,是企业里面比较常见的针对高并发、数据量大的场景下的一种技术优化方案,所谓"分库分表",根本就不是一件事儿,而是三件事儿,他们要解决的问题也都不一样,这三个事儿分别是"只分库不分表"、"只分表不分库”、以及"既分库又分表"。本文我们一起理解分库、分表的奥秘。

小徐的博客 2851

【UVM实战】第七章:UVM中的寄存器模型(1)寄存器模型简介

寄存器模型简介~

悟已往之不谏 知来者之可追 2070

【MySQL】MySQL分库分表详解[通俗易懂]

在互联网还未崛起的时代,我们的传统应用都有这样一个特点:访问量、数据量都比较小,单库单表都完全可以支撑整个业务。随着互联网的发展和用户规模的迅速扩大,对系统的要求也越来越高。因此传统的MySQL单库单表架构的性能问题就暴露出来了。

Eucalyptus's blog 1万+

23、视频时间码与数字同步技术详解

本文深入解析了视频时间码与数字同步技术的核心原理及应用。涵盖线性时间码(LTC)和垂直间隔时间码(VITC)的结构与特性,详细阐述了降帧时间码的补偿机制及其在影视制作中的重要性。文章还介绍了定时参考信号(TRS)在SDTV和HDTV中的实现方式,分析了辅助数据的传输结构与发展趋势,并探讨了SDI编码技术及其在不同视频标准下的差异。通过实际应用场景和技术发展影响的剖析,全面展示了这些关键技术如何支撑现代视频系统的高效运行与持续创新。

wine的专栏 236

YOLO26改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣ 什么!不知道如何改进模型⁉️ 本专栏已更新260多种不同的改进方法,所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行,性价比极高。2️⃣ 找不到合适的模块⁉️ 所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,并进行二次创新,新颖度高,创新度高,能够适应不同的任务场景。3️⃣ 不确定自己改进的步骤、结果是否正确⁉️ 订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容,非常适合新手

Limiiiing的博客 6312

Mysql 分库分表

MySQL单库数据量在5000万以内性能比较好,超过阈值后性能会随着数据量的增大而变弱。MySQL单表数据量是500w-1000w之间性能比较好,超过1000w性能也会下降。

George_huhu的博客 1536

机器人视觉联动精度优化:从±2mm到±0.02mm,产线级手眼标定全实战

2025年我接东莞长安Type-C接口分拣项目的时候,就是栽在了手眼标定上:实验室里标定完精度±0.5mm,一到产线直接掉到±2mm,机器人10次有3次抓不住,2000多件Type-C接口直接报废,还撞坏了2套汇川SCARA机器人的吸盘,本来45天的工期拖了3个月,不仅没赚到钱,还倒贴了几万块。手眼标定从来不是简单的跑个demo、算个矩阵就完事了,它是一个系统工程:从硬件选型、安装固定、相机标定、标定流程、算法优化、环境控制、重复验证,每一个环节都会影响最终的联动精度。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 382

mysql面试——分库分表

将数据按照一定的规则分布到多个数据库实例中。每个数据库实例称为一个“分片”(Shard),每个分片存储一部分数据。MySQL 分库分表是应对大规模数据和高并发访问的有效手段,但同时也带来了系统复杂性和维护成本的增加。在实际应用中,应根据业务需求、数据规模和技术团队的能力,合理选择分库分表的策略和工具,并注重数据一致性、查询优化和系统的可扩展性。通过科学的规划和设计,分库分表可以显著提升系统的性能和可用性,为业务的持续发展提供坚实的数据库基础。

2401_86405063的博客 1653

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MySQL如何分库分表

MySQL如何分库分表,

zhw21w的博客 2244

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

mysql分库分表

可以分为垂直分片和水平分片。

hsnsnusjs的博客 3472

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

MySQL 分库分表,写得太好了!

https://www.toutiao.com/a6603492496779510276/?tt_from=mobile_qq&amp;utm_campaign=client_share&amp;timestamp=1549497188&amp;app=news_article&amp;utm_source=mobile_qq&amp;iid=59568063679&amp;utm_medium=...

azhuyangjun的博客 10万+

Mysql分库分表

Mysql作为做流行的开源数据库,在各大互联网公司被广泛使用。通常我们用一个库就可以满足需求,但是随着业务的增长,数据量和并发量迅速膨胀。Mysql单表数据量到百万以上的时候,查询效率就会受到影响,另外Mysql单库能承受的并发也有限。这个时候我们需要做分库分表,来提高数据库的性能和扩展性

qq_36037795的博客 2820

MYSQL分库分表

分库分表是解决数据库性能瓶颈和存储瓶颈的关键技术,主要包括垂直拆分和水平拆分两种形式。垂直拆分通过按字段分离不常用数据或业务模块来提高性能,而水平拆分则通过按行分散数据来突破单表容量限制。实施时需考虑数据量、增长速度、查询性能等指标,并选择合适的拆分策略(如范围分片、哈希分片)。文章详细介绍了MySQL分库分表的实现方案(应用层实现、中间件实现),以及分布式ID生成、跨库查询、分布式事务等挑战的解决方案,最后通过电商订单系统和社交平台的实战案例展示了具体应用。

lengxia0的博客 970

【进阶篇】MySQL分库分表详解

假设有一个电商网站,随着用户量和订单量的增加,单一数据库难以承载如此庞大的数据量,查询速度也逐渐降低,这时就需要进行分库分表。

日拱一卒无有尽,功不唐捐终入海 2682

MySQL之分库分表

MySQL之分库分表

weixin_52690231的博客 1135

MySQL 分库分表实战

MySQL 分库分表是一种有效的数据库优化技术,可以提高数据库的性能、扩展性和可用性。在实际应用中,我们需要根据业务需求和数据特点选择合适的分库分表策略和实现方式,进行合理的数据库设计和代码实现,并进行性能测试和监控运维,以确保系统的稳定运行。

Honmaple的博客 1206

MySQL 分库分表

在MySQL中,分库分表是一种常用的数据库优化策略,特别是在数据量巨大时,可以有效提高查询性能和系统的可扩展性。分库:将数据分散到多个数据库中,每个数据库可以放在不同的物理服务器上。分表:将一个大表拆分成多个小表,这些小表可以在同一个数据库中,也可以分布在不同的数据库中。

qq_33807380的博客 1678

Mysql分库分表实战(一)——一文搞懂Mysql数据库分库分表

由于业务需要,需要对Mysql数据库进行分库分表,故而最近一直在整理分库分表的相关知识,现手上的工作也告一段落了,抽空将自己最近的学习结果转化为博文,分享给大家,本博文打算做成一个系列的,首先是分库分表的理论知识的了解,其次是基于Java编程语言的分库分表的框架的开发,最后是分库分表的编制。让大家不仅仅从理论上了解mysql的分库分表,通过代码来更深层次的了解,理论是如何落地到实践的。最后非常感...

Amos技术足迹 4万+
上一篇: MySQL慢查询日志
下一篇: MySQL复制+高可用技术
奋起直追CDS
博客等级 码龄11年 57粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值