新闻数据库分表案例
2023-09-14 08:59:51 时间
中国广东省深圳市龙华新区民治街道溪山美地
518131
+86 13113668890
+86 755 29812080
netkiller@msn.com
这里我通过一个新闻网站为例,解决分表的问题
避免开发中经常拼接表,我采用一个一劳永逸的方法,建立一个 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;
数据库原理及应用——数据库的基本查询和高级查询 (一)简单查询操作 该实验包括投影、选择条件表达,数据排序,使用临时表等。 具体完成以下题目,将它们转换为SQL语句表示,在学生课程数据库中实现其数据查询操作。 (二)连接查询操作 该实验包括等值连接、自然连接、求笛卡儿积、一般连接、外连接、内连接、左连接、右连接和自连接等 (三)嵌套查询操作 该实验包括在SQL Server查询分析器中使用IN、比较符、ANY或ALL和EXISTS操作符进行嵌套查询操作。具体完成以下各题。将它们用SQL语句表示,在学生选课中实现其数据嵌套查询操作 (四)集合查询和统计查询
netkiller Nickname:netkiller | English name: Neo chen | QQ: 291379 | 订阅号:netkiller-ebook | 网站:http://www.netkiller.cn
相关文章
- RF失败案例重跑
- VB.net:VB.net编程语言学习之ADO.net基本名称空间与类的简介、案例应用(实现与SQL数据库编程案例)之详细攻略
- Database之SQLSever:SQLSever数据库管理(GUI法/SQL语句命令法两种方法实现备份(完整备份、差异备份、日志备份)、还原、删除、修改数据库等案例)之详细攻略
- js数据层中间件单页运用简单构思和应用案例
- ML之SIFT_FLANN:FLANN算法的简介、使用方法(对图片提取SIFT特征并利用FLANN方法实现计算图像相似度并可视化案例)之详细攻略
- 〖Python 数据库开发实战 - Python与MySQL交互篇②〗- SQL 注入攻击案例
- 〖Python 数据库开发实战 - Python与Redis交互篇⑨〗- 利用 redis-py 实现模拟商品秒杀活动案例
- 〖Python 数据库开发实战 - Python与Redis交互篇⑪〗- 综合案例 - 新闻管理系统 - 缓存新闻数据至redis
- 实践案例丨Pt-osc工具连接rds for mysql 数据库失败
- Python获取命令行参数的正确方法,案例详解
- 第12讲:DQL数据查询语句综合案例实战
- 【案例分享】基于CANoe的诊断Coding及Flash实现
- Linux【实操篇】—— Shell函数、Shell编程综合案例(定时备份数据库)