MariaDB 層常用業務

来源:http://www.cnblogs.com/life2refuel/archive/2017/06/22/7066067.html
-Advertisement-
Play Games

前言 - 簡單準備一下前戲 前面寫過幾篇mariadb 數據的隨筆, 多數偏C/C++層面. 這次分享一下平時開發中, 處理的一些數據層面的業務. 對於MariaDB, 不做過多介紹. 如果你有Ubuntu 系統, 可以通過下麵來個環境玩玩 這裡扯一下, 假如你複製mysql 腳本到 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

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 碰見一個很奇葩的問題, 某些手機在設置了不知什麼後, 某些 APP 死活 HTTPS 請求失敗, 例如以 UMeng 統計HTTP 請求失敗為例, Log如下: UMLOG: (Error Applog) Error Domain=NSURLErrorDomain Code=-1202 "此伺服器的 ...
  • Volley源碼分析 雖然在2017年,volley已經是一個逐漸被淘汰的框架,但其代碼短小精悍,網路架構設計巧妙,還是有很多值得學習的地方。 第一篇文章,分析了請求隊列的代碼,請求隊列也是我們使用Volley的關鍵一步。 第二篇文章會分析Dispatcher RequestQueue 創建Requ ...
  • Kotlin做為一門編程語言,已經出現好幾年了,但此前在國內並不聞名。自從5月份谷歌宣佈它成為Android的官方開發語言之後,Kotlin猛然竄紅了,雖說短期內Kotlin無法取代Java,但對於一門新技術,我們還是有必要好好學習。 谷歌號稱從Android Studio 3.0開始完全支持Kot ...
  • 一,代碼: - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSLog(@" 產生隨機字元串 %@",[self g ...
  • requests 模塊 模塊的由來: 瀏覽器可以瀏覽網站, 是由於瀏覽器發送了requests , 各種請求.打開一個網站可能有幾十到幾百個請求. 從而伺服器端會反饋各種因應不同請求生成的數據. 我們瀏覽器再decode這些數據來顯示在屏幕上. requests, 就是Python一種用來偽裝成模擬... ...
  • 前 言 mysql mysql語法--本篇學習都是通過使用Navicat Premium(資料庫管理工具),連接mysql數據. 本篇學習主要有兩個部分: 一、創建用戶,創建資料庫,給用戶分配許可權,刪除用戶許可權。 二、MYSQL中常見的數據類型 三、表-創建表、主鍵、外鍵 四、資料庫設計的三大範式 ...
  • Introduction to Schema Objects 資料庫 schema 是存儲數據結構的邏輯容器,被稱為 。例如,表和索引是 通過 SQL 來創建和操作 資料庫用戶具有口令並擁有各種資料庫的許可權,每個用戶擁有一個單獨的 ,schema 與用戶具有相同的名字 schema 包含相應用戶的全 ...
  • create table DEPT ( deptno NUMBER(2) not null, dname VARCHAR2(20), loc VARCHAR2(13) ); alter table DEPT add constraint PK_DEPT primary key (DEPTNO); c ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...