mysql新闻分表,新闻数据库分表案例 - http://www.netkiller.cn - OSCHINA - 中文开源技术交流社区...
本文节选自《Netkiller Architect 手札》
6.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;
mysql新闻分表,新闻数据库分表案例 - http://www.netkiller.cn - OSCHINA - 中文开源技术交流社区...相关推荐
- mysql的第一次作业_数据库入门第一次作业 - osc_2frf70qv的个人空间 - OSCHINA - 中文开源技术交流社区...
数据库入门第一次作业 1.在某大学的<>中,用如下表来存储学生信息.其中,用户信息.星座信息和血型信息分别采用Users.Star和Blood三个表来保存,其中Users表引用了Star和 ...
- mysql 列转行union all_MySQL中的列转行 - osc_qheq8wav的个人空间 - OSCHINA - 中文开源技术交流社区...
mysql中的列转行 在工作中遇到的一个MySQL列转行的统计: 场景 用户访问app时会跳出标签选择页面让用户选择喜欢的标签,在数据库中记录的是数组样式的字符串,数据样式大致如下: id user_ ...
- 小米 mysql sql审核_mysql和sql - 小米米儿小的个人空间 - OSCHINA - 中文开源技术交流社区...
一.MySQL的安装 使用命令终端打开服务启动项:services.msc 安装MySQL后,应注意以下配置: 1.选择第一项Reconfigure Instance进行重新配置. 2.选择第一项详细 ...
- mysql查询95031班人数_MySQL的查询练习 - osc_1ngzqx2h的个人空间 - OSCHINA - 中文开源技术交流社区...
student表 teacher表 course表 score表 对这四个表进行一些练习. 1:查询student表中所有记录. select *from student; 2:查询student表中 ...
- mysql for loop_MySQL循环语句 - Linux就该这么学的个人空间 - OSCHINA - 中文开源技术交流社区...
mysql常见的三种循环方式:while.repeat和loop循环.还有一种goto,不推荐使用. 1.while循环 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQ ...
- zabbix中mysql连不上的排错_zabbix使用排错 - oschina130111的个人空间 - OSCHINA - 中文开源技术交流社区...
在linux系统中,几乎所有运行的服务都会产生相对就的日志(log),所运行的程序在出错时都会有错误提示,即使没有任何提示也可以通过"echo $"来查看运行是否成功.使用zabb ...
- mysql跨年统计年前年后_PHP面试总结 - osc_chmxgjn9的个人空间 - OSCHINA - 中文开源技术交流社区...
18.一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子 ...
- mysql实训5答案_MySQL 实训篇 - osc_mi06gsf5的个人空间 - OSCHINA - 中文开源技术交流社区...
一.创建student.achievement表 1. create table student(id int unsigned auto_increment primary key,name var ...
- mysql 源头锁,mysql 使用手册 - 追梦,一个伟大程序员的源头。 - OSCHINA - 中文开源技术交流社区...
在Console中创建procedure的过程 delimiter $$ create procedure name(IN parameter INT) begin ................. ...
最新文章
- AI吉尼斯:那些你不知道的人工智能之“最”
- 关于Swing窗体有时候要放大缩小边框才能显示问题?
- Oracle忘记用户名和密码的解决方案
- poj2104(区间第k大+离散化)
- 白领学python_大学生应该早早自学Python,Ps,Pr,office三件套,还是等到要用的时候再学?...
- Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计
- 前端学习(176):列表元素
- 给做IT的一点心理安慰
- java testng 项目_java – Junit4和TestNG在Maven的一个项目中
- Windows Phone XNAでアニメーション - ぐるぐる
- 【转】python编写规范——中标软件有限公司测试中心
- 智能优化算法:郊狼优化算法-附代码
- ORACLE lag,lead
- atitit knowmng知识管理 索引part2
- 四选1数据选择器的VHDL程序设计
- 一个简单的WEB网页制作作业——黑色的山河旅行社网站(5个页面)HTML+CSS+JavaScript
- 第33篇-steam密码参数分析
- 大学生html电影网页设计作业成品 我喜欢的电影榜单题材网页制作代码 简单静态网页模板下载
- vs2013的matconvnet_MatConvNet 安装使用
- JS验证邮箱合理性(初级版)
热门文章
- 打开catia界面全是白色怎么办_CAD如何批量打印?图纸看不清怎么办?这两大问题如何解决?...
- absolute 绝对定位水平居中问题
- Windows Server 2003自带NAT功能,轻松实现不同网段互访
- 媒体QA | “9问” ALVA Systems,【答疑帖】来咯!
- [NOIP 2013提高组]转圈游戏 题解
- 普中单片机开发板HC6800-EM3 v2.2 3.0无法烧录下载程序解决
- vs 添加快捷键 | 修改快捷键、添加注释、添加快速插入代码(使用#if 0 注释)
- devTools百度网盘
- SQL Server 语句大全(3)-------常用函数
- 如何修复Windows10系统电脑开机自检?