MySQL水平分表
以Laravel项目为例,分表读取代码如下:
public function changeTable($companyId) {
// 分表算法,根据companyId选择分表,请勿修改算法,以免混淆分表数据
$posfix = intval($companyId) % 10;
$tableName = $posfix ? "demo_$posfix" : 'demo';
return $this->setTable($tableName);
} 调用方法:
public function countCompanyData($companyId, $condition) {
return $this->changeTable($companyId)->multiwhere($condition)->count();
} 算法实现后,就差表数据迁移了 步骤一,先执行 SHOW CREATE TABLE `demo`; 得到原始表的创建语句,然后,加个下标,就是分表的创建语句了 步骤二,创建所需要的所有分表,需要创建 1~9 编号的分表,这里以 编号1 为例
CREATE TABLE `demo_1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`company_id` int(11) unsigned NOT NULL COMMENT '商家ID',
`content` varchar(255) NOT NULL COMMENT '内容',
`phone` varchar(11) NOT NULL COMMENT '手机号'
PRIMARY KEY (`id`),
KEY `company_id` (`company_id`),
KEY `Phone` (`phone`,`company_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='演示表'; 步骤三,创建好分表后,执行迁移语句,将原始表(demo表)的数据按分表规则(商家ID取模)迁入对应表(demo_x表)
INSERT INTO `demo_1` SELECT * FROM `demo` WHERE MOD(`company_id`, 10) = 1;
INSERT INTO `demo_2` SELECT * FROM `demo` WHERE MOD(`company_id`, 10) = 2;
INSERT INTO `demo_3` SELECT * FROM `demo` WHERE MOD(`company_id`, 10) = 3;
INSERT INTO `demo_4` SELECT * FROM `demo` WHERE MOD(`company_id`, 10) = 4;
INSERT INTO `demo_5` SELECT * FROM `demo` WHERE MOD(`company_id`, 10) = 5;
INSERT INTO `demo_6` SELECT * FROM `demo` WHERE MOD(`company_id`, 10) = 6;
INSERT INTO `demo_7` SELECT * FROM `demo` WHERE MOD(`company_id`, 10) = 7;
INSERT INTO `demo_8` SELECT * FROM `demo` WHERE MOD(`company_id`, 10) = 8;
INSERT INTO `demo_9` SELECT * FROM `demo` WHERE MOD(`company_id`, 10) = 9; 步骤四,备份原始表(demo表)的数据 步骤五,删除已迁移的数据,留下属于 编号0 的表数据
DELETE FROM `demo` WHERE MOD(`company_id`, 10) != 0; P.S:修改后所有的SQL操作,都应该含有类似语句 WHERE company_id = xxx ,这样才能找到具体的分表。
如果业务中有和company_id无关的汇总类的查询,那么可以所有分表循环再汇总信息,以统计所有记录为例 public function countTables() {
$posfixList = range(0, 9);
$sum = 0;
foreach ($posfixList as $posfix) {
$tableName = $posfix ? "demo_$posfix" : 'demo' ;
$count = $this->setTable($tableName)->count();
}
$sum += $count;
return $sum;
}
MySQL水平分表的更多相关文章
- mysql 水平分表技术
这里做的是我的一个笔记. 水平分表比较简单, 理解就是: 合并的表使用的必须是MyISAM引擎 表的结构必须一致,包括索引.字段类型.引擎和字符集 数据表 user1 CREATE TABLE `us ...
- (转)mysql水平分表和垂直分表和数据库分区
坚信数据库的物理设计在对高级数据库的性能影响上远比其他因素重要.给大家说一下经过专家对Oracle的研究,他们解释了为什么拙劣的物理设计是数据库停机(无论是有计划的还是没计划的)背后的主要原因.但在这 ...
- mysql水平分表和垂直分表的优缺点
表分割有两种方式: 1.水平分割:根据一列或多列数据的值把数据行放到两个独立的表中. 水平分割通常在下面的情况下使用. •表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数 ...
- mysql 水平分表
新建10张表,user_0,user_1,...user_9,方法不可串用,采用hash或取余法,获取要操作的表名,取值用对应存值的方法 1.hash取余法 public function part_ ...
- mysql中的优化, 简单的说了一下垂直分表, 水平分表(有几种模运算),读写分离.
一.mysql中的优化 where语句的优化 1.尽量避免在 where 子句中对字段进行表达式操作select id from uinfo_jifen where jifen/60 > 100 ...
- MySQL常见水平分表技术方案
根据经验,Mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉:水平分表能够很大程度较少这些压力. 1.按时间分表 这种分表方式有一定的局限性,当数据有较强的实效 ...
- mysql使用MRG_MyISAM(MERGE)实现水平分表
在MySQL中数据的优化尤其是大数据量的优化是一门很大的学问,当然其它数据库也是如此,即使你不是DBA,做为一名程序员掌握一些基本的优化信息,也可以让你在自己的程序开发中受益匪浅.当然数据库的优化有很 ...
- mysql数据库的水平分表与垂直分表实例讲解
mysql语句的优化有局限性,mysql语句的优化都是围绕着索引去优化的,那么如果mysql中的索引也解决不了海量数据查询慢的状况,那么有了水平分表与垂直分表的出现(我就是记录一下自己的理解) 水平分 ...
- TDSQL MySQL版基本原理-水平分表 读写分离 弹性扩展 强同步
TDSQL MySQL版(TDSQL for MySQL)是部署在腾讯云上的一种支持自动水平拆分.Shared Nothing 架构的分布式数据库.TDSQL MySQL版 即业务获取的是完整的逻辑库 ...
随机推荐
- 把execel表数据导入mysql数据库
今天,是我来公司第二周的第一天. 作为新入职的实习生,目前还没适合我的实质项目工作,今天的学习任务是: 把execel表数据导入到mysql数据库,再练习下java操作JDBC. 先了解下execel ...
- TCP定时器 之 TIME_WAIT定时器
概述 在FIN_WAIT_2收到对端发来的FIN,并回复ACK之后,会进入TIME_WAIT状态,此时添加定时器,定时器超时会将tw控制块从ehash和bhash中删除,并且释放tw控制块: 启动定时 ...
- mybatis 中的 update 返回值
摘自:https://www.jianshu.com/p/80270b93082a 如果定义一个如下的update函数,那么这个函数的返回值到底是啥意思呢?是受影响的行数吗? 验证之前我们先看看数据库 ...
- LeetCode 19. 删除链表的倒数第N个节点(Remove Nth Node From End Of List)
题目描述 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后, ...
- T2695 桶哥的问题——吃桶
~~~~~我~是~真的~忍不了~这个~取模~的~锅~了~~~~~ T2695 桶哥的问题——吃桶 前传 1.T2686 桶哥的问题——买桶 这题真的hin简单,真的 2.T2691 桶哥的问题——送桶 ...
- CondenseNet: An Efficient DenseNet using Learned Group Convolutions
1. 摘要 作者提出了一个前所未有高效的新奇网络结构,称之为 CondenseNet,该结构结合了密集连接性和可学习的分组卷积模块. 密集连接性有利于网络中的特征复用,而可学习的分组卷积模块则可以移除 ...
- 第六章 SpringCloud之Ribbon负载均衡
###################使用默认的负载均衡(轮询)############################# 1.pom.xml <?xml version="1.0&q ...
- flutter flutter_swiper使用
flutter_swiper flutter最强大的siwiper, 多种布局方式,无限轮播,Android和IOS双端适配. 更多详情信息请移步:https://blog.csdn.net/u011 ...
- OpenStack 虚拟机冷/热迁移的实现原理与代码分析
目录 文章目录 目录 前文列表 冷迁移代码分析(基于 Newton) Nova 冷迁移实现原理 热迁移代码分析 Nova 热迁移实现原理 向 libvirtd 发出 Live Migration 指令 ...
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_2 请求参数绑定实体类型
参数封装到javaBean对象中 创建新的包domain.在下面新建Account 实现序列化 的接口,定义几个属性 生成get和set.还有toString的方法 表单 重新发布tomcat jav ...