博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
新闻数据库分表案例
阅读量:6335 次
发布时间:2019-06-22

本文共 3389 字,大约阅读时间需要 11 分钟。

hot3.png

Netkiller MySQL 手札

MySQL MariaDB...

Mr. Neo Chan, 陈景峰(BG7NYT)

中国广东省深圳市龙华新区民治街道溪山美地
518131
+86 13113668890
+86 755 29812080
<>

文档始创于2010-11-18

版权 © 2011, 2012, 2013 Netkiller(Neo Chan). All rights reserved.

版权声明

转载请与作者联系,转载时请务必标明文章原始出处和作者信息及本声明。

07114249_qIRw.png
文档出处:

$Date: 2013-04-10 15:03:49 +0800 (Wed, 10 Apr 2013) $

我的系列文档

     

4.16.3. 新闻数据库分表案例

这里我通过一个新闻网站为例,解决分表的问题

避免开发中经常拼接表,我采用一个一劳永逸的方法,建立一个 news 表使用黑洞引擎,然后通过出发器将数据分流到匹配的表中。同时采用uuid替代数字序列,可以保证未来数年不会出现ID用尽。

CREATE TABLE IF NOT EXISTS `news` (  `uuid` varchar(36) NOT NULL COMMENT '唯一ID',  `title` varchar(50) NOT NULL COMMENT '新闻标题',  `body` text NOT NULL COMMENT '新闻正文',  `ctime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',  `mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',  `atime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '访问时间',  PRIMARY KEY (`uuid`)) ENGINE=BLACKHOLE DEFAULT CHARSET=utf8;

该表仅仅用于举例,结构比较简单。接下来创建年份分表,你也可以每个月一个表,根据你的许下灵活调整。表结构与上面的news表相同,注意 ENGINE=InnoDB。

CREATE TABLE IF NOT EXISTS `news_2012` (  `uuid` varchar(36) NOT NULL COMMENT '唯一ID',  `title` varchar(50) NOT NULL COMMENT '新闻标题',  `body` text NOT NULL COMMENT '新闻正文',  `ctime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',  `mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',  `atime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '访问时间',  PRIMARY KEY (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='news 表';CREATE TABLE IF NOT EXISTS `news_2013` (  `uuid` varchar(36) NOT NULL COMMENT '唯一ID',  `title` varchar(50) NOT NULL COMMENT '新闻标题',  `body` text NOT NULL COMMENT '新闻正文',  `ctime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',  `mtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',  `atime` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '访问时间',  PRIMARY KEY (`uuid`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='news 表';

uuid 索引表,主要的功能是通过uuid查询出该记录在那张表中。更好的方案是将数据放入solr中处理,包括标题与内容搜索等等。

CREATE TABLE `news_index` (	`uuid` VARCHAR(36) NOT NULL,	`tbl_name` VARCHAR(10) NOT NULL,	PRIMARY KEY (`uuid`))COMMENT='news uuid 索引表'COLLATE='utf8_general_ci'ENGINE=InnoDB;

news_insert 过程,用于向目标表中插入数据,可以单独call 但不建议。因为insert 远比 call 更通用,要考虑移植性与通用性

DELIMITER //CREATE DEFINER=`neo`@`%` PROCEDURE `news_insert`(IN `uuid` vARCHAR(36), IN `title` VARCHAR(50), IN `body` TEXT, IN `ctime` TIMESTAMP)BEGIN	if year(ctime) = '2012' then		insert into news_2012(uuid,title,body,ctime) values(uuid,title, body, ctime);	end if;	if year(ctime) = '2013' then		insert into news_2013(uuid,title,body,ctime) values(uuid,title, body, ctime);	end if;	insert into news_index values(uuid, year(ctime));END//DELIMITER ;

插入触发器,负责获取 uuid 然后调用存储过程

SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='';DELIMITER //CREATE TRIGGER `news_before_insert` BEFORE INSERT ON `news` FOR EACH ROW BEGIN	IF new.uuid is null or new.uuid = '' or length(new.uuid) != 36 THEN		set new.uuid=uuid();	END IF;	call news_insert(new.uuid,new.title,new.body,new.ctime);END//DELIMITER ;SET SQL_MODE=@OLDTMP_SQL_MODE;

这个触发器用户保护表中的 uuid 值不被修改。

SET @OLDTMP_SQL_MODE=@@SQL_MODE, SQL_MODE='';DELIMITER //CREATE TRIGGER `news_before_update` BEFORE UPDATE ON `news_2013` FOR EACH ROW BEGIN	set new.uuid = old.uuid;END//DELIMITER ;SET SQL_MODE=@OLDTMP_SQL_MODE;

转载于:https://my.oschina.net/neochen/blog/174758

你可能感兴趣的文章
oracle故障解决
查看>>
tcpdump
查看>>
数据库内存结构
查看>>
利用Shell开发跳板机功能脚本案例
查看>>
51CTO的技术门诊谈OSSIM
查看>>
六年心路成长 —— 做自己
查看>>
ios电话拨打进行监听电话状态
查看>>
京东基于Spark的风控系统架构实践和技术细节
查看>>
什么时候使用CountDownLatch
查看>>
C#之MemberwiseClone与Clone
查看>>
Android性能优化之利用Rxlifecycle解决RxJava内存泄漏
查看>>
转: 如何为你的开源项目选择一个合适的开源协议?
查看>>
关系型数据库和NOSQL数据库对比
查看>>
Atitit 记录方法调用参数上下文arguments
查看>>
webstorm常用功能FTP,及常用快捷键
查看>>
eclipse html 打开方式
查看>>
[求助] win7 x64 封装 出现 Administrator.xxxxx 的问题
查看>>
人类投资经理再也无法击败电脑的时代终将到来了...
查看>>
一个最小手势库的实现
查看>>
HoloLens开发手记 - Vuforia开发概述 Vuforia development overview
查看>>