数据库优化三部曲(3)-分库分表-一蓑烟雨任平生

Mycat 读写分离+分库分表 上次进过GTID复制的学习记录,已经搭建好了主从复制的服务器,现在利用现有的主从复制环境,加上正在研究的Mycat,实现了主流分布式数据库的测试 Mycat就不用多介绍了,可以实现很多分布式数据库的功能,极大的减轻数据库服务器的压力,包括读写分离以及分库分表,本测试对这两种功能都进行了测试,进行相应记录 本文以Mycat官方给出的例子来进行解释总结 阅读详情

前言

1、分区

对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm。

根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表呢,还是一张表。分区可以把表分到不同的硬盘上,但不能分配到不同服务器上。

优点:数据不存在多个副本,不必进行数据复制,性能更高。
缺点:分区策略必须经过充分考虑,避免多个分区之间的数据存在关联关系,每个分区都是单点,如果某个分区宕机,就会影响到系统的使用。

2、分片

对业务透明,在物理实现上分成多个服务器,不同的分片在不同服务器上。如HDFS。

3、分表

同库分表:所有的分表都在一个数据库中,由于数据库中表名不能重复,因此需要把数据表名起成不同的名字。

优点:由于都在一个数据库中,公共表,不必进行复制,处理更简单。

缺点:由于还在一个数据库中,CPU、内存、文件IO、网络IO等瓶颈还是无法解决,只能降低单表中的数据记录数。表名不一致,会导后续的处理复杂(参照mysql meage存储引擎来处理)

不同库分表:由于分表在不同的数据库中,这个时候就可以使用同样的表名。

优点:CPU、内存、文件IO、网络IO等瓶颈可以得到有效解决,表名相同,处理起来相对简单。

缺点:公共表由于在所有的分表都要使用,因此要进行复制、同步。一些聚合的操作,join,group by,order等难以顺利进行。

4、分库

分表和分区都是基于同一个数据库里的数据分离技巧,对数据库性能有一定提升,但是随着业务数据量的增加,原来所有的数据都是在一个数据库上的,网络IO及文件IO都集中在一个数据库上的,因此CPU、内存、文件IO、网络IO都可能会成为系统瓶颈。

当业务系统的数据容量接近或超过单台服务器的容量、QPS/TPS接近或超过单个数据库实例的处理极限等。此时,往往是采用垂直和水平结合的数据拆分方法,把数据服务和数据存储分布到多台数据库服务器上。

分库只是一个通俗说法,更标准名称是数据分片,采用类似分布式数据库理论指导的方法实现,对应用程序达到数据服务的全透明和数据存储的全透明

三个文件

schema.xml主要配置物理数据库的信息,逻辑数据库名称以及表和路由策略之间的关系等;

rule.xml主要配置路由策略、拆分规则等;

server.xml主要配置逻辑数据库的信息,包括用户名、密码、端口等,也是代码中数据库连接的地址;

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<system>
	<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
	<property name="ignoreUnknownCommand">0</property><!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为忽略该报文,返回ok报文。
	在某些mysql客户端存在客户端已经登录的时候还会继续发送登录报文,mycat会报错,该设置可以绕过这个错误-->
	<property name="useHandshakeV10">1</property>
    <property name="removeGraveAccent">1</property>
	<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
		<property name="sqlExecuteTimeout">300</property>  <!-- SQL 执行超时 单位:秒-->
		<property name="sequnceHandlerType">1</property>
		<!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
		INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx");
		-->
		<!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况-->
		<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
	<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
	<property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
	<!-- <property name="processorBufferChunk">40960</property> -->
	<!-- 
	<property name="processors">1</property> 
	<property name="processorExecutor">32</property> 
	 -->
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
		<property name="processorBufferPoolType">0</property>
		<!--默认是65535 64K 用于sql解析时最大文本长度 -->
		<!--<property name="maxStringLiteralLength">65535</property>-->
		<!--<property name="sequnceHandlerType">0</property>-->
		<!--<property name="backSocketNoDelay">1</property>-->
		<!--<property name="frontSocketNoDelay">1</property>-->
		<!--<property name="processorExecutor">16</property>-->
		<!--
			<property name="serverPort">8066</property> <property name="managerPort">9066</property> 
			<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
			<property name="dataNodeIdleCheckPeriod">300000</property> 5 * 60 * 1000L; //连接空闲检查
			<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
		<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
		<property name="handleDistributedTransactions">0</property>
		
			<!--
			off heap for merge/order/group/limit      1开启   0关闭
		-->
		<property name="useOffHeapForMerge">0</property>

		<!--
			单位为m
		-->
        <property name="memoryPageSize">64k</property>

		<!--
			单位为k
		-->
		<property name="spillsFileBufferSize">1k</property>

		<property name="useStreamOutput">0</property>

		<!--
			单位为m
		-->
		<property name="systemReserveMemorySize">384m</property>


		<!--是否采用zookeeper协调切换  -->
		<property name="useZKSwitch">false</property>

		<!-- XA Recovery Log日志路径 -->
		<!--<property name="XARecoveryLogBaseDir">./</property>-->

		<!-- XA Recovery Log日志名称 -->
		<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
		<!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
		<property name="strictTxIsolation">false</property>
		
		<property name="useZKSwitch">true</property>
		<!--如果为0的话,涉及多个DataNode的catlet任务不会跨线程执行-->
		<property name="parallExecute">0</property>
	</system>
	
	<!-- 全局SQL防火墙设置 -->
	<!--白名单可以使用通配符%或着*-->
	<!--例如<host host="127.0.0.*" user="root"/>-->
	<!--例如<host host="127.0.*" user="root"/>-->
	<!--例如<host host="127.*" user="root"/>-->
	<!--例如<host host="1*7.*" user="root"/>-->
	<!--这些配置情况下对于127.0.0.1都能以root账户登录-->
	<!--
	<firewall>
	   <whitehost>
	      <host host="1*7.0.0.*" user="root"/>
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
	-->

	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
		<property name="defaultSchema">TESTDB</property>
		<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

	
</mycat:server>

其中,逻辑数据库的名称为TESTDB,用户名root、密码123456,服务端口为8066。

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	
	 <tableRule name="role1">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>
 
	<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- how many data nodes -->
		<property name="count">2</property>
	</function>
 
</mycat:rule>

定义路由策略role1,该策略对分表的id进行mod2除法,对模2算法的结果进行分库。路由策略还有好多,这里就以此为例。

<?xml version="1.0"?>  
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">  
 
    <!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致  -->  
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">  
        <table name="users" primaryKey="id"  dataNode="node_db01" />  
        <table name="item" primaryKey="id" dataNode="node_db02,node_db03" rule="role1" />  
    </schema>  
 
    <!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->  
    <dataNode name="node_db01" dataHost="dataHost01" database="db01" />  
    <dataNode name="node_db02" dataHost="dataHost01" database="db02" />  
    <dataNode name="node_db03" dataHost="dataHost01" database="db03" />  
 
    <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->  
    <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">  
            <heartbeat>select user()</heartbeat>  
            <writeHost host="server1" url="127.0.0.1:3306" user="root" password="root"/>
    </dataHost>  
</mycat:schema>

通过该配置文件可以看到,物理数据库的信息为127.0.0.1:3306,root,root。数据库中有三个库,分别为db01,db02,db03。db01数据库中有表users,db02、db03数据库有表item,且主键id自增,路由策略为role1,即mod2策略。

测试

插入若干数据
在这里插入图片描述

胸大数据库
在这里插入图片描述

熊二数据库
在这里插入图片描述

思考

1、非分片字段查询,整库查询导致性能极差

Mycat中的路由结果是通过分片字段和分片方法来确定的。例如下图中的一个Mycat分库方案:
根据 tt_waybill 表的 id 字段来进行分片
分片方法为 id 值取 3 的模,根据模值确定在DB1,DB2,DB3中的某个分片
在这里插入图片描述

如果查询条件中有 id 字段的情况还好,查询将会落到某个具体的分片。例如:

MySQL>select * from tt_waybill where id = 12330;

此时Mycat会计算路由结果

12330 % 3 = 0 –> DB1

并将该请求路由到DB1上去执行。

如果查询条件中没有 分片字段 条件,例如:

mysql>select * from tt_waybill where waybill_no =88661;

此时Mycat无法计算路由,便发送到所有节点上执行:

DB1 –> select * from tt_waybill where waybill_no =88661; 
DB2 –> select * from tt_waybill where waybill_no =88661; 
DB3 –> select * from tt_waybill where waybill_no =88661;

如果该分片字段选择度高,也是业务常用的查询维度,一般只有一个或极少数个DB节点命中(返回结果集)。示例中只有3个DB节点,而实际应用中的DB节点数远超过这个,假如有50个,那么前端的一个查询,落到MySQL数据库上则变成50个查询,会极大消耗Mycat和MySQL数据库资源。

如果设计使用Mycat时有非分片字段查询,请考虑放弃!

2、分页,没有排序的情况下统一sql执行结果随机选择不同库的查询结果

先看一下Mycat是如何处理分页操作的,假如有如下Mycat分库方案:
一张表有30份数据分布在3个分片DB上,具体数据分布如下

DB1:[0,1,2,3,4,10,11,12,13,14] 
DB2:[5,6,7,8,9,16,17,18,19] 
DB3:[20,21,22,23,24,25,26,27,28,29]

(这个示例的场景中没有查询条件,所以都是全分片查询,也就没有假定该表的分片字段和分片方法)

在这里插入图片描述

当应用执行如下分页查询时

mysql>select * from table limit 2;

Mycat将该SQL请求分发到各个DB节点去执行,并接收各个DB节点的返回结果

DB1: [0,1] 
DB2: [5,6] 
DB3: [20,21]

但Mycat向应用返回的结果集取决于哪个DB节点最先返回结果给Mycat。如果Mycat最先收到DB1节点的结果集,那么Mycat返回给应用端的结果集为 [0,1],如果Mycat最先收到DB2节点的结果集,那么返回给应用端的结果集为 [5,6]。也就是说,相同情况下,同一个SQL,在Mycat上执行时会有不同的返回结果。

在Mycat中执行分页操作时必须显示加上排序条件才能保证结果的正确性,下面看一下Mycat对排序分页的处理逻辑。
假如在前面的分页查询中加上了排序条件(假如表数据的列名为id)

mysql>select * from table order by id limit 2;

Mycat的处理逻辑如下图:
在这里插入图片描述
在有排序呢条件的情况下,Mycat接收到各个DB节点的返回结果后,对其进行最小堆运算,计算出所有结果集中最小的两条记录 [0,1] 返回给应用。

但是,当排序分页中有 偏移量 (offset)时,处理逻辑又有不同。假如应用的查询SQL如下:

mysql>select * from table order by id limit 5,2;

如果按照上述排序分页逻辑来处理,那么处理结果如下图:
在这里插入图片描述Mycat将各个DB节点返回的数据 [10,11], [16,17], [20,21] 经过最小堆计算后返回给应用的结果集是 [10,11]。可是,对于应用而言,该表的所有数据明明是 0-29 这30个数据的集合,limit 5,2 操作返回的结果集应该是 [5,6],如果返回 [10,11] 则是错误的处理逻辑。

所以Mycat在处理 有偏移量的排序分页 时是另外一套逻辑——改写SQL 。如下图:

正确排序偏移分页
在这里插入图片描述

Mycat在下发有 limit m,n 的SQL语句时会对其进行改写,改写成 limit 0, m+n 来保证查询结果的逻辑正确性。所以,Mycat发送到后端DB上的SQL语句是

mysql>select * from table order by id limit 0,7;

各个DB返回给Mycat的结果集是

DB1: [0,1,2,3,4,10,11] 
DB2: [5,6,7,8,9,16,17] 
DB3: [20,21,22,23,24,25,26]

经过最小堆计算后得到最小序列 [0,1,2,3,4,5,6] ,然后返回偏移量为5的两个结果为 [5,6] 。

虽然Mycat返回了正确的结果,但是仔细推敲发现这类操作的处理逻辑是及其消耗(浪费)资源的。应用需要的结果集为2条,Mycat中需要处理的结果数为21条。也就是说,对于有 t 个DB节点的全分片 limit m, n 操作,Mycat需要处理的数据量为 (m+n)*t 个。比如实际应用中有50个DB节点,要执行limit 1000,10操作,则Mycat处理的数据量为 50500 条,返回结果集为10,当偏移量更大时,内存和CPU资源的消耗则是数十倍增加。

如果设计使用Mycat时有分页排序,请考虑放弃!

3、任意表JOIN,关联字段不在同一个库导致查询失败
先看一下在单库中JOIN中的场景。假设在某单库中有 player 和 team 两张表,player 表中的 team_id 字段与 team 表中的 id 字段相关联。操作场景如下图:
在这里插入图片描述

JOIN操作的SQL如下

mysql>select p_name,t_name from player p, team t where p.no = 3 and p.team_id = t.id;

此时能查询出结果
p_name t_name
Wade Heat

如果将这两个表的数据分库后,相关联的数据可能分布在不同的DB节点上,如下图:

在这里插入图片描述
这个SQL在各个单独的分片DB中都查不出结果,也就是说Mycat不能查询出正确的结果集。

设计使用Mycat时如果要进行表JOIN操作,要确保两个表的关联字段具有相同的数据分布,否则请考虑放弃!
4、分布式事务

Mycat并没有根据二阶段提交协议实现 XA事务,而是只保证 prepare 阶段数据一致性的 弱XA事务 ,实现过程如下:

应用开启事务后Mycat标识该连接为非自动提交,比如前端执行

mysql>begin;

Mycat不会立即把命令发送到DB节点上,等后续下发SQL时,Mycat从连接池获取非自动提交的连接去执行。

在这里插入图片描述
Mycat会等待各个节点的返回结果,如果都执行成功,Mycat给该连接标识为 Prepare Ready 状态,如果有一个节点执行失败,则标识为 Rollback 状态。

在这里插入图片描述
执行完成后Mycat等待前端发送 commit 或 rollback 命令。发送 commit 命令时,Mycat检测当前连接是否为 Prepare Ready 状态,若是,则将 commit 命令发送到各个DB节点。

在这里插入图片描述
但是,这一阶段是无法保证一致性的,如果一个DB节点在 commit 时故障,而其他DB节点 commit 成功,Mycat会一直等待故障DB节点返回结果。Mycat只有收到所有DB节点的成功执行结果才会向前端返回 执行成功 的包,此时Mycat只能一直 waiting 直至TIMEOUT,导致事务一致性被破坏。

设计使用Mycat时如果有分布式事务,得先看是否得保证事务得强一致性,否则请考虑放弃!

在这里插入图片描述

分库分表之MyCat应用 目录 1、分库分表介绍 1.1 垂直切分 1.2 水平切分 2、MyCAT介绍 3、MyCAT架构 4、MyCAT的关键特性 5、MyCAT分片策略 6、实战演练 6.1 创建数据库: 6.2 安装MyCAT 6.3 配置文件介绍 6.3 启动MyCAT测试 7、Java测试 7.1 pom依赖 7.2 spring配置 7.3 单元测试 8、Mycat自定义分片机制 8.1 Mycat的源码包 8.2 自定义分片类 8.3 打包替换 9、拓展 1、分库分表. 阅读详情

相关推荐

我的架构梦:(五十四) 分库分表实战及中间件之Mycat实战

分库分表实战及中间件之Mycat实战一、 Mycat 简介二、Mycat 核心概念三、server.xml配置四、schema.xml配置五、rule.xml配置六、Mycat实战七、Mycat事务 一、 Mycat 简介 Mycat 是一个实现了 MySQL 协议的 Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客 户端工具和命令行访问,而其后端可以用 MySQL 原生协议或JDBC 协议与多个 MySQL 服务器通信, 其核心功能是分库分表和读写分离,即将一个大表水平分割为 N 个

riemann_的博客 1745

MyCat实现分库分表

将字典表或者符合字典表特性的一些表定义为全局表,则从另外一个方面,很好的解决了数据 JOIN 的难题。MySQL单表存储数据条数是有瓶颈的,单表达到1000万条数据就达到了瓶颈,会影响查询效率,需要进行水平拆分(分表)进行优化。为orders表设置数据节点为dn1、dn2,并指定分片规则为mod_rule(自定义的名字)查询订单注重时效,历史订单被查询的次数少,如此分片会造成一个节点访问多,一个访问少,不平均。分库的原则:有紧密关联关系的表应该在一个库里,相互没有关联关系的表可以分到不同的库里。

Knight 4123

Tiny windows 11 安装与部署

需要注意,安装完后键入 windows 键,输入 update 先更新系统。点击开始,等待完成即可,用户可自定义。

m0_73351035的博客 9045

Mycat+分库分表

目录 分库分表垂直分表垂直分库水平分库水平分表 mycat实操场景:mycat配置mysql读写分离配置 众所周知,单表1000w,库5000w ,当数据达到一定维度,即时索引优化也会导致性能严重下降方案一:我们可以选择氪金,通过提升服务器硬件,增加存储容量,cpu等等方案二:我们可以将数据分散开来,将其分散到不同位置的数据库中——>从而减缓单一数据库性能问题总结:而我们的分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来的大数据库->若干个数据库(其实这里只是将数据放到若干个数据库节点上

weixin_57128596的博客 9559

IMU预积分--详细推导过程

IMU预积分推导

weixin_51547017的博客 2万+

ESP32 TWAI CAN库实战:从零构建CyberGear微电机控制框架

本文详细介绍了如何利用ESP32的TWAI控制器和Arduino环境,从零构建一个面向对象的CyberGear微电机控制框架。该框架将复杂的CAN通信协议封装为简洁的API,开发者无需深究底层细节,即可轻松实现电机的速度、位置和扭矩控制,大幅简化机器人关节、云台等项目的开发流程。

oil88的博客 499

数据库优化三部曲(2)-读写分离-一蓑烟雨任平生

前言 上篇文章介绍了MySql的主从复制,读写分离就不写了,毕竟MySql比Oracle简单太多了(自我感觉),这篇主要写一下读写分离,照葫芦画瓢,会了Oracle的读写分离,那么MySql的读写分离不就是张飞吃豆芽? 数据库为什么要读写分离呢? 因为面试的时候当你把数据库优化这块讲的头头是道,什么主从复制,什么读写分离,什么分库分表,都可以滔滔不绝,那么你的工资最少可以+5000块钱啊,哈哈哈,开个玩笑,任何一款软件都要依赖数据库,不然数据从哪里来,所以数据库压力是每个公司都要面对的问题,淘宝双十一,京东

Jaeger_Java的博客 368

别再只会用Kriging了!用Python+GeoPandas手把手实现IDW插值(附完整代码与可视化)

本文详细介绍了如何使用Python和GeoPandas实现反距离加权插值(IDW),包括核心算法、参数调优和可视化技巧。通过完整代码示例,帮助读者掌握这一空间数据分析技术,适用于环境监测、气象预报等多个领域,提升数据处理效率和灵活性。

weixin_30872157的博客 225

MyCat分库分表入门示例

一、简介 分库:将原本一个数据库中的数据,拆分到多个数据库进行保存,然后我们通过访问一个数据库,在MyCat中成为逻辑库。 分表:如果一个数据表的数据量已经超过千万,那么查询速度会比较慢,这时候可以考虑进行分表操作,将一个表的数据保存到多个表中,这样可以控制单表的数据量。 二、作用 分库分表的作用可以通过下表对比可见: 分库分表作用 分库分表前 分库分表后 并发情况 ...

weixiaohuai的博客 1187

【YOLOv11工业级实战】22. YOLOv11动态蛇形卷积破解弯曲裂纹检测难题(附2小时部署代码)

摘要:本文聚焦工业场景中弯曲裂纹检测的核心痛点,针对风电叶片、织物纱线等曲线缺陷传统检测漏检率高的问题,提出基于动态蛇形卷积(DSC)的YOLOv11优化方案。因企业数据保密,采用AITEX织物缺陷库(含曲线纱线断裂标签)结合Blender物理仿真生成2000张弯曲裂纹数据,实现从数据准备到部署的全流程实操。通过将DSC模块插入YOLOv11 Neck层,弯曲裂纹召回率从68.1%提升至89.4%,mAP@0.5达83.7%,推理速度3.1ms(2080Ti)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1152

(持续更新中!)详解【计算机类&面试真题】军队文职考试 ——第二期(真题+解析)| 网络协议的三个核心要素;交互式系统中的非剥夺策略;中断和陷入的区别;可变分区管理中的硬件机制;数据库系统的优点

本篇博客将讨论军队文职面试(计算机类)的几个关键问题。我们将介绍网络协议的核心要素(帮助你理解网络通信的基本原理)、交互式系统中的非剥夺策略(解释为何这是一个优秀的策略以及其对用户体验、系统稳定性和可预测性的影响)、中断和陷入的区别(从引起原因、处理机制、权限级别和应用等方面进行阐述)、可变分区管理的硬件机制以及数据库系统与文件系统的优点比较。通过阅读本文,您将深入了解这些话题,为面试准备和实际应用提供有价值的知识。

追光者♂:记录、分享、总结、提升,现象级专栏《Python从入门到人工智能》作者,无惧黑暗,坚信曙光 1704

Mycat实现分库分表_mycat如何对现有库做分库分表

IPschemaorders分库操作不是在原来的老数据库上进行操作,需要准备两台机器分别安装新的数据库。在数据节点dn1dn2上分别创建数据库ordersMycat登录切换到创建四个表,客户表(customer)、订单表(orders)、订单详细表() 、订单状态字典表(查看表信息,可以看到成功分库。

2301_82241942的博客 922

2026必学:LangChain+Playwright爬虫,赋能RAG智能问答系统

RAG(检索增强生成)智能问答系统的效果,80%取决于数据源的质量。2026年,LangChain与Playwright的组合成为企业级RAG数据采集的黄金搭档:LangChain提供标准化的RAG数据处理链路,Playwright解决动态网页渲染的核心痛点,两者结合能高效采集、结构化处理各类网页数据(动态渲染页、复杂交互页、反爬页),为RAG系统提供高质量语料。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1705

MyCat

目录前言1.海量存储问题1.1 背景描述1.2 分库分表1.2.1 什么是分库分表1.2.2 分库分表的方式1.2.2.1 垂直分库1.2.2.2 垂直分表1.2.2.3 水平分库1.2.2.4 水平分表1.3 如何实现分库分表2. MyCat2.1 什么是MyCat2.2 MyCat支持的数据库2.3 MyCat 概念说明2.3.1 MyCat的分片策略2.4 MyCat的下载和安装2.4.1 安装环境2.4.2 MyCat安装2.5 MyCat核心配置2.5.1 schema.xml配置2.5.2 se

m0_46337171的博客 660

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

MyCat分库分表

MyCat

dys000000的博客 2748

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

利用MyCAT分库分表

文章目录MyCAT分库分表一、分库分表简介二、垂直切分---分库1、思想2、配置实现三、水平切分 MyCAT分库分表 一、分库分表简介 在业务数据量过多的时候,而且数据不断持续增长的情况下,为了缓解单台服务器的压力,可以考虑使用分库或者分表方案 二、垂直切分—分库 1、思想 一个数据库由很多的表构成,每个表对应这不同的业务,垂直切分是按照业务将表进行手动分类,利用MyCAT中间件进行管理,将同一个数据库中的多个表分开放在多个数据库中 2、配置实现 环境描述 192.168.152.10

ljh451321的博客 2129

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MyCat教程【分库分表】

  本文我们来介绍下MyCat的分库分表操作 分库分表 一、分片规则介绍   在rule.xml中定义了各种myCat支持的分片规则。 分片规则 说明 auto-sharding-long 默认的规则,以 500 万为单位,实现分片规则.逻辑库 A 对应 dataNode - db1 和 db2. 1-500 万保存在 db1 中, 500 万零 1 到 1000 万保存在 db2...

波波烤鸭的博客 8373

使用mycat实现分表分库

分表分库中间件市面上主要有两种,即当当的sharding-jdbc和阿里的mycat,二者的区别对比如下: 本次要向读者展示的是mycat的安装与使用 1.安装环境 1)操作系统:centos7 2)jdk1.8(mycat是使用java语言开发的) 3)在三台服务上安装了mysql数据库实例,ip地址分别为192.168.0.91、192.168.0.92、192.168.0.93。 4)本次的目的是实现在192.168.0.91、192.168.0.93两台服务器上实现分表分库,并在192.168.0.

kaijixin的博客 4369

利用Mycat分库分表操作

10.为什么分库分表 1 什么是分库分表? 其实就是字面意思,很好理解: 分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。 分表:从单张表拆分成多张表的过程,将数据散落在多张表内。 2 为什么要分库分表? 关键字:提升性能、增加可用性。 1) 从性能上看 随着单库中的数据量越来越大、数据库的查询QPS越来越高,相应的,对数据库的读写所需要的时间也越来越多。数据库的读写性能可能会成为业务发展的瓶颈。对应的,就需要做数据库性能方面的优化。本文中我们只讨论数据库层面的优化,不讨论

wqr111的博客 777

MySQL实操(三)——使用Mycat实现分库分表+读写分离

MySQL分库分表 MySQL读写分离 MySQL实操 MySQL主从复制 MySQL高可用

醉酒的戈多的专栏 4321

分库分表之MyCat详解

MyCat简介,server.xml详解,schema.xml详解,rule.xml详解

weixin_45881674的博客 1059

MyCat2数据库分库分表,读写分离中间件(踩坑大实战内附详细图文教程)

Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语 句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理, 最终再返回给用户

我的身体只需要很少的粮食就能养活;而我的灵魂却非常地贪婪,需要日月星辰、山川湖泊和大自然的滋养。 2686

SpringBoot-数据库中间件 Mycat完成分库分表

一、背景 随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的磁盘、IO、系统开销,甚至性能上的瓶颈,而一台服务的资源终究是有限的,因此需要对数据库和表进行拆分,从而更好的提供数据服务。 当用户表达到千万级别,在做很多操作的时候都会很吃力,所以当数据增长到 1000 万以上就需要分库分表来缓解单库(表)的压力。 二、什么是分库分表 [1] 简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面,以达到分散单台设备负载

嘻哈熊的专栏 4428

MySQL分库分表及中间件Mycat

文章目录一、前言1.1 垂直切分1.2 垂直切分的优缺点:1.3 水平切分1.3.1 水平分表1.3.2 水平分库1.4 水平切分优缺点二、Mycat 中间件实现读写分离2.1 mycat2.2 mycat安装2.3 利用mycat实现mysql的读写分离三、Mysql高可用 一、前言 刚开始我们的系统只用了单机数据库 随着用户的不断增多,考虑到系统的高可用和越来越多的用户请求,我们开始使用数据库主从架构 当用户量级和业务进一步提升后,写请求越来越多,这时我们开始使用了分库分表 如何解决? 数据切分 简单来

人丑就要多读书的博客 3178

mycat的安装使用(技术篇)

第一章:概念 1.为什么要拆分: ①MySQL 实例内部结构 1.单一架构 [2]复制架构: 尽管搭建了复制架构,但是实际上从逻辑上来说仍然只有一个 db_hr 数据库。 ②性能瓶颈 MySQL 工作过程中的性能瓶颈主要来自于下面三个方面(同等硬件条件下): 数据存储量:单表 1000 万条数据达到极限;500 万条开始性能明显下降;300 万条开始就应该考虑拆分。 I/O 瓶颈:关系型数据库以硬盘作为主要存储介质,所以必然存在 I/O 瓶颈。 访问量瓶颈:通常 MySQL 的最

qq_1757537040的博客 697
上一篇: 数据库优化三部曲(2)-读写分离-一蓑烟雨任平生
下一篇: 用XPath一分钟上手爬虫,良心之作__一蓑烟雨任平生
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值