MariaDB 层常用业务
前言 - 简单准备一下前戏
前面写过几篇mariadb 数据的随笔, 多数偏C/C++层面. 这次分享一下平时开发中, 处理的一些数据层面的业务.
对于MariaDB, 不做过多介绍. 如果你有Ubuntu 系统, 可以通过下面来个环境玩玩
# 先搜索要的包, 再去安装
apt-cache search mariadb
sudo apt-get install mariadb-server
sudo apt-get install mariadb-client # 进入mariadb 开始操作
sudo mysql -uroot
status
这里扯一下, 假如你复制mysql 脚本到 mariadb中执行, 出现下面字符串
Display all possibilities? (y or n)
造成原因是MariaDB中对Tab处理的问题, 你需要将脚本串中Tab替换成空格. 如果你用的是notepad++ 可以做下面操作
-> 编程语言多了, 什么扯坑都有. 多习惯就成经验了, 一朝鲜吃遍天~~ 只能开心就好~~.
在好戏出现之前, 我们需要一些测试的基础数据.执行下面的构建脚本
-- 1.1 先构建实验前戏
create database test;
use test;
create table t_rand (
-- 推荐 设计主键的时候 id 为 bigint, int 为历史原因
id int unsigned not null primary key
); -- 4.1 先构建数据, 我们就以 t_rand 表为例
drop table if exists t_score;
create table t_score(score int);
insert into t_score value(1);
insert into t_score value(2);
insert into t_score value(10);
insert into t_score value(10);
insert into t_score value(10);
insert into t_score value(3);
insert into t_score value(4);
insert into t_score value(6);
insert into t_score value(5);
select * from t_score;
-> 到这基本的储备工作已经完成了, 那我们开始吧~
正文 - 从实际业务出发
扯个谈吧, 这篇文章挺不错的 你为什么会离开游戏行业?
1. 生成8位随机数业务
有时候按照产品需求希望生成int 8位的随机id. 常见做法是单独搞一个随机数表,这样做有点小恶心.
后面我弄了投机取巧的办法.八位随机数范围[10000000, 99999999] 我把它切分为
[10000000, 89999999] and [90000000, 99999999]两部分生成,
前半分采用rand and check. 后半部分采用 max + 1. 总的思路如下
-- 1.2 开始构建存储过程
drop procedure if exists p_rand_insert;
delimiter $
create procedure p_rand_insert(out oid int unsigned)
begin
declare mi int unsigned;
declare si int unsigned default 10000000;
declare ei int unsigned default 70000000; declare i tinyint default 3;
declare f tinyint default 0; while i > 0 && f = 0 do
set f = 1;
set mi = floor(si + ei * rand());
select 0 into f from t_rand where id = mi limit 1;
set i = i - 1;
end while; if f = 0 then
select max(id) into mi from t_rand;
if mi < ei + si then
set mi = ei + si;
end if;
set mi = mi + 1;
end if; insert into t_rand value(mi);
set oid = mi;
end
$
delimiter ;
不妨测试一下,
-- 1.3 开始构建测试数据
truncate table t_rand; call p_rand_insert(@oid);
select @oid;
call p_rand_insert(@oid);
call p_rand_insert(@oid);
call p_rand_insert(@oid); select * from t_rand;
得到的结果如下, 扯一点这个需求前期在于保护游戏内部一些隐私数据. 哈哈, 其实对于隐私数据就可以不显示才是最好.
2. 清除db上面所有数据
经常需要清除数据, 这里写了个脚本直接清除指定DB上所有数据. 大家可以尝试用一下.
-- 2. 清除db上面所有数据
drop procedure if exists p_truncate;
delimiter $
create procedure p_truncate(dbname varchar(64))
begin
declare tname varchar(64);
declare lop tinyint default 1; -- 声明游标
declare getnames cursor for select table_name
from information_schema.tables
where table_type = 'BASE TABLE' and table_schema = dbname;
-- 声明handler 必须在游标声明之后, 当游标数据读取完毕会触发下面set
declare continue handler for not found set lop = 0; -- 打开游标
open getnames; -- 操作游标, 读取第一行数据
fetch getnames into tname;
while lop = 1 do
set @tsql = concat('truncate table ', dbname, '.', tname);
prepare stmt from @tsql;
execute stmt;
deallocate prepare stmt; -- 读取下一个行数据
fetch getnames into tname;
end while; -- 关闭游标
close getnames;
end
$
delimiter ;
使用也很简单, 看下面小例子, 后面也有数据图演示
-- 2.1 测试清除所有数据
select * from test.t_rand;
call p_truncate('test');
select * from test.t_rand;
对于实现的细节部分, 查查帮助手册就明白了. 再补充一点, truncate 和 delete 区别. 直观上前者特别快.
后者慢在 删除的过程是每次从表中删除一行,并且会将该行的删除操作作为事务记录到日志中.
当然了truncate一个小细节, 它会干掉 auto_increment 当前的种子值, 让其变成0.
3. 导出数据库表结构和表数据
这个在项目移植的时候会用上就一句话
sudo mysqldump -uroot -d test > test_d.sql
-h -p 自己什么环境自己补上, 我就本地测试没有密码. -d 表示不导出表数据. 如果只是为了导出特定的表. 可以写成 test t_rand
写到这里让我想起了那时候刚工作的第二年, 看见运维大拿写出这段话. 当时 心里 就 1万个敬佩, wow 好厉害~
n年过去了, 不知道那些人还好吗, 哈哈, 估计菜鸡的我没机会再敬他们一杯了 ~
4. 后台统计需要排序
这个业务很普遍, 无外乎下面两种. 用 t_score表做测试. 直接看图吧.
-- 4.2 够好排序
select t.score,
(select count(s.score) + 1 from t_score s where s.score > t.score) rank
from t_score t order by t.score desc;
另外一种, 1->2->3...这种来回搞
-- 4.3 都好排序
select t.score,
(select count(s.score) + 1
from (select score from t_score group by score) s
where s.score > t.score) rank
from t_score t order by t.score desc;
到这里基本上数据库(mariadb or mysql) 开发层面的业务也介绍了一些了.哈哈, 下次有机会再补充.
突然毫无征兆想起一句话, 优化是毒药.
后记 - 一切如旧的结束
错误是难免的欢迎指正, O(∩_∩)O哈哈~ 人生路很长, 已在脱贫路上奋勇向前了 (๑╹◡╹)ノ""" 不能给党丢饭~
似水年华 http://music.163.com/#/song?id=399954010
MariaDB 层常用业务的更多相关文章
- 【DRP】-Dao层常用功能代码:增删改查
本系列博客内容为:做DRP系统中Dao层常用功能. 该项目采用MVC架构 C(Controller)控制器,主要职责;1.取得表单参数:2.调用业务逻辑:3.转向页面 M(Model)模型,主要职责: ...
- JavaEE中表现层、持久层、业务层的职责分析(转载)
表现层.持久层.业务层 注:本文转载于:http://www.blogjava.net/jiabao/archive/2007/04/08/109189.html 为了实现web层(struts)和持 ...
- 【转载】 JAVA三层架构,持久层,业务层,表现层的理解
JAVA三层架构,持久层,业务层,表现层的理解 转载:http://blog.csdn.net/ljf_study/article/details/64443653 SSH: Struts(表示层)+ ...
- Spring/SpringMVC/MyBatis(持久层、业务层、控制层思路小结)
准备工作: ## 7 导入省市区数据到数据库中 1. 从FTP下载SQL脚本文件 2. 把脚本文件移动到易于描述绝对路径的位置 3. 进入MySQL控制台 4. 使用`xxx_xxx`数据库 5. 运 ...
- MyBatis知多少(6)表现层与业务逻辑层
表现层 表现层负责向最终用户展示应用程序的控制方式以及数据.它还要负责所有信息的布局和格式.今天,商业应用程序最流行的表现方式应该算是Web前端了,它使用HTML和JavaScript并通 过Web浏 ...
- 请问JAVA三层架构,持久层,业务层,表现层,都该怎么理解?和MVC三层模型有什么区别
持久层用来固化数据,如常说的DAO层,操作数据库将数据入库业务层用来实现整体的业务逻辑 如 前台获得了数据,逻辑层去解析这些数据,效验这些数据等操作表现层很好解释 你现在看到的网页 一些界面 都属于 ...
- 常用业务接口界面化 in python flask
背景: 对于业务测试来说,有一些基础业务接口是需要经常调用的,如根据userId查询某人的信息,修改某人的xx属性,一般的接口都有验签(或者说token)机制,使用postman等工具的话,也是需要去 ...
- CDN 边缘规则,三秒部署、支持定制、即时生效,多种规则覆盖常用业务场景
2017年的最后一周,又拍云进行了一次重要升级,将自定义 Rewrite 升级为"边缘规则".互联网应用场景的日益多样化,简单.方便.快速的根据不同应用场景实现不同的功能变得越来越 ...
- android 框架层 常用类介绍
名称 功能描述 示意图 activitymanager 管理应用程序的周期并提供常用的回退功能 window manager 窗口管理者 content provider 用于访问另一个的数据,或者共 ...
随机推荐
- linux 服务器丢包故障排查
项目开了个P2P服务器,但是运行一段时间就会出现丢包问题,具体表现为:1.udp丢包严重(一分钟收发分别1.5W) 2.ssh(用于运维指令)连接不上该服务器(超时) 3.服务器运行好像没什么异常,u ...
- 什么是Docker?(6-12)
关于什么是Docker,刚开始学的时候一脸懵X,这个东西到底是干嘛用的啊?偶然间在知乎上刷到一个比较通俗的解释: Docker就相当于一个容器,这个容器了不得了,它里面能搭好你项目需要的所有环境,并且 ...
- 【题解】HNOI2014世界树
脑子不清醒的时候千万别写题.写题写不下去了千万别死扛,重构才是你唯一的出路QAQ 昨天很想快点写道题,思路没有很清晰的时候就写了,结果……今天一怒之下决定重整思路重构代码,其实不过是半个小时的事情…… ...
- 【刷题】BZOJ 4950 [Wf2017]Mission Improbable
Description 那是春日里一个天气晴朗的好日子,你准备去见见你的老朋友Patrick,也是你之前的犯罪同伙.Patrick在编程竞赛上豪赌输掉了一大笔钱,所以他需要再干一票.为此他需要你的帮助 ...
- 玩(lay) 解题报告
玩(lay) 题目名称 你的昆特牌打的太好啦!不一会你就 \(\tt{AK}\) 了 \(\tt{NOGP}\),只能无聊地堆牌玩! 题目描述 你有一些矩形卡牌,每次你会作如下三个操作: 紧挨着最后一 ...
- mybatis的Mapper代理原理
前言:在mybatis的使用中,我们会习惯采用XXMapper.java+XXMapper.xml(两个文件的名字必须保持一致)的模式来开发dao层,那么问题来了,在XXMapper的文件里只有接口, ...
- 【贪心】【P2117】小Z的矩阵
传送门 Description 小Z最近迷上了矩阵,他定义了一个对于一种特殊矩阵的特征函数G.对于N*N的矩阵A,A的所有元素均为0或1, 当然询问一个矩阵的G值实在是太简单了.小Z在给出一个N*N矩 ...
- django项目初探
一:创建django项目 设置数据库(默认sqlit3) mysql: setting:中设置 DATABASES = { 'default': { 'ENGINE': 'django.db.back ...
- H5背景音乐自动播放(兼容微信IOS,进程后台切换自动停止播放,本文例子为Vue写法)
<template> <audio src="./static/music.mp3" id="bgMusic" preload="a ...
- CCPC-Winter Camp div2 day1
A:机器人 传送门:https://www.zhixincode.com/contest/1/problem/A 题意:地图是由A.B两根线组成的,机器人一开始是在A线上的S点,他初始时可以选择任意方 ...