本文节选自《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 - 中文开源技术交流社区...相关推荐

  1. mysql的第一次作业_数据库入门第一次作业 - osc_2frf70qv的个人空间 - OSCHINA - 中文开源技术交流社区...

    数据库入门第一次作业 1.在某大学的<>中,用如下表来存储学生信息.其中,用户信息.星座信息和血型信息分别采用Users.Star和Blood三个表来保存,其中Users表引用了Star和 ...

  2. mysql 列转行union all_MySQL中的列转行 - osc_qheq8wav的个人空间 - OSCHINA - 中文开源技术交流社区...

    mysql中的列转行 在工作中遇到的一个MySQL列转行的统计: 场景 用户访问app时会跳出标签选择页面让用户选择喜欢的标签,在数据库中记录的是数组样式的字符串,数据样式大致如下: id user_ ...

  3. 小米 mysql sql审核_mysql和sql - 小米米儿小的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.MySQL的安装 使用命令终端打开服务启动项:services.msc 安装MySQL后,应注意以下配置: 1.选择第一项Reconfigure Instance进行重新配置. 2.选择第一项详细 ...

  4. mysql查询95031班人数_MySQL的查询练习 - osc_1ngzqx2h的个人空间 - OSCHINA - 中文开源技术交流社区...

    student表 teacher表 course表 score表 对这四个表进行一些练习. 1:查询student表中所有记录. select *from student; 2:查询student表中 ...

  5. mysql for loop_MySQL循环语句 - Linux就该这么学的个人空间 - OSCHINA - 中文开源技术交流社区...

    mysql常见的三种循环方式:while.repeat和loop循环.还有一种goto,不推荐使用. 1.while循环 -- 设置mysql分隔符为//,也就意味着,当遇到下一个//时,整体执行SQ ...

  6. zabbix中mysql连不上的排错_zabbix使用排错 - oschina130111的个人空间 - OSCHINA - 中文开源技术交流社区...

    在linux系统中,几乎所有运行的服务都会产生相对就的日志(log),所运行的程序在出错时都会有错误提示,即使没有任何提示也可以通过"echo $"来查看运行是否成功.使用zabb ...

  7. mysql跨年统计年前年后_PHP面试总结 - osc_chmxgjn9的个人空间 - OSCHINA - 中文开源技术交流社区...

    18.一群猴子排成一圈,按1,2,-,n依次编号.然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去-,如此不停 的进行下去,直到最后只剩下一只猴子为止,那只猴子 ...

  8. mysql实训5答案_MySQL 实训篇 - osc_mi06gsf5的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.创建student.achievement表 1. create table student(id int unsigned auto_increment primary key,name var ...

  9. mysql 源头锁,mysql 使用手册 - 追梦,一个伟大程序员的源头。 - OSCHINA - 中文开源技术交流社区...

    在Console中创建procedure的过程 delimiter $$ create procedure name(IN parameter INT) begin ................. ...

最新文章

  1. AI吉尼斯:那些你不知道的人工智能之“最”
  2. 关于Swing窗体有时候要放大缩小边框才能显示问题?
  3. Oracle忘记用户名和密码的解决方案
  4. poj2104(区间第k大+离散化)
  5. 白领学python_大学生应该早早自学Python,Ps,Pr,office三件套,还是等到要用的时候再学?...
  6. Nginx技术研究系列7-Azure环境中Nginx高可用性和部署架构设计
  7. 前端学习(176):列表元素
  8. 给做IT的一点心理安慰
  9. java testng 项目_java – Junit4和TestNG在Maven的一个项目中
  10. Windows Phone XNAでアニメーション - ぐるぐる
  11. 【转】python编写规范——中标软件有限公司测试中心
  12. 智能优化算法:郊狼优化算法-附代码
  13. ORACLE lag,lead
  14. atitit knowmng知识管理 索引part2
  15. 四选1数据选择器的VHDL程序设计
  16. 一个简单的WEB网页制作作业——黑色的山河旅行社网站(5个页面)HTML+CSS+JavaScript
  17. 第33篇-steam密码参数分析
  18. 大学生html电影网页设计作业成品 我喜欢的电影榜单题材网页制作代码 简单静态网页模板下载
  19. vs2013的matconvnet_MatConvNet 安装使用
  20. JS验证邮箱合理性(初级版)

热门文章

  1. 打开catia界面全是白色怎么办_CAD如何批量打印?图纸看不清怎么办?这两大问题如何解决?...
  2. absolute 绝对定位水平居中问题
  3. Windows Server 2003自带NAT功能,轻松实现不同网段互访
  4. 媒体QA | “9问” ALVA Systems,【答疑帖】来咯!
  5. [NOIP 2013提高组]转圈游戏 题解
  6. 普中单片机开发板HC6800-EM3 v2.2 3.0无法烧录下载程序解决
  7. vs 添加快捷键 | 修改快捷键、添加注释、添加快速插入代码(使用#if 0 注释)
  8. devTools百度网盘
  9. SQL Server 语句大全(3)-------常用函数
  10. 如何修复Windows10系统电脑开机自检?