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版 即业务获取的是完整的逻辑库 ...
随机推荐
- C++入门经典-例5.16-输出引用
1:如不加特殊说明,一般认为引用指的都是左值引用.引用实际上是一种隐式指针,它为对象建立一个别名,通过操作符&来实现,引用的形式如下: 数据类型 & 表达式: 例如: int a=10 ...
- eclipse中解决update maven之后jre被改成1.5的问题
1.在项目的pom.xml中加入下面的代码就能解决(加入插件) <build> <plugins> <plugin> <groupId>org.apac ...
- Spring Boot中使用 Thymeleaf
目录 1.pom.xml引入thymeleaf 2.关闭缓存application.properties 3.编写Controller类 4.模板html 5.运行结果 1.pom.xml引入thym ...
- 何为受控组件(controlled component)
在 HTML 中,类似 , 和 这样的表单元素会维护自身的状态,并基于用户的输入来更新:当用户提交表单时,前面提到的元素的值将随表单一起被发送.但在 React 中会有些不同,包含表单元素的组件将会在 ...
- Point-wise Mutual Information
Point-wise Mutual Information (Yao, et al 2019) reclaimed a clear description of Point-wise Mutual I ...
- css中相对定位和绝对定位
相对定位: #box_relative { position: relative; left: 30px; top: 20px; } 绝对定位: #box_relative { position: a ...
- Ubuntu 16.04安装、卸载mysql及怎么使用SQL常用操作语句
以前都是在window上操作,连接数据库,最近转Ubuntu系统,故此,记下安装过程 一,安装mysql,Ctrl+Alt+T打开终端,一步步分别输入命令 //安装mysql服务 sudo apt-g ...
- springboot之RocketMq实现
环境:win10 1.下载安装包 http://mirrors.tuna.tsinghua.edu.cn/apache/rocketmq/4.4.0/rocketmq-all-4.4.0-bin-re ...
- redis源码分析之数据结构:跳跃表
跳跃表是一种随机化的数据结构,在查找.插入和删除这些字典操作上,其效率可比拟于平衡二叉树(如红黑树),大多数操作只需要O(log n)平均时间,但它的代码以及原理更简单. 和链表.字典等数据结构被广泛 ...
- 监控Linux服务器上python服务脚本
提供给公司使用的测试平台这两天频繁地挂掉,影响到相关同事的正常使用,决定在服务器上写个监控脚本,监控到服务挂了就启动起来,一分钟检查一次.注:后台服务使用的是python.监控脚本如下: NUM=`p ...