zoukankan      html  css  js  c++  java
  • MySQL水平分表

    业务表增长速度较快,单表数据较大,对表的读写有影响。
    思路:化整为零,把单表拆解为多表,按指定的算法规则选择表。
    好处:能大幅降低单表的数据,读写更快,同时分散了表数据,
    SQL语句也分散到不同的表中,可以大幅降低 “锁表” 的情况
    以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数据库连接报错ERRoR1130(HY000)
    Ladap相关知识精简资料
    Github访问慢,解决方案
    IIS短文件漏洞成因,及修复方案
    Kali linux简单匿名处理方法
    NHibernate实践总结(二) 在mapping文件中设置抓取策略对HQL与Criteria造成不同影响的测试与验证
    NHibernate 3.x新功能实践(二) QueryOver(下)
    NHibernate实践总结(三)HQL的thetastyle join对无关联实体的连接与应用
    NHibernate实践总结(一)
    Scott Hanselman's 2009 NET与Windows终极开发工具列表
  • 原文地址:https://www.cnblogs.com/funsion/p/11424703.html
Copyright © 2011-2022 走看看