C++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 475 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