余額可以單獨(dú)用一個(gè)余額記錄表,這樣如果要查詢每次消費(fèi)記錄的時(shí)候,也能查出來每次消費(fèi)后還有多少余額。余額記錄表里面主要是三個(gè)字段:用戶賬號(hào)、每次消費(fèi)后的余額、時(shí)間點(diǎn)。
站在用戶的角度思考問題,與客戶深入溝通,找到巴中網(wǎng)站設(shè)計(jì)與巴中網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、域名注冊(cè)、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋巴中地區(qū)。
CREATE TABLE account
(
id integer NOT NULL DEFAULT nextval('trade_id_seq'::regclass),
no character varying(10) NOT NULL, -- 賬號(hào)
balance money NOT NULL DEFAULT 0.00, -- 余額
datetime timestamp without time zone NOT NULL DEFAULT (now())::timestamp(0) without time zone,
CONSTRAINT account_pkey PRIMARY KEY (id)
)
通過每次的余額變化就知道每次消費(fèi)后的余額情況
select acc.*, (select sum(balance)+acc.balance from account as ac where ac.id acc.id) as profit from account as acc;
id | no | balance | datetime | profit
----+------+----------+---------------------+---------
1 | 1000 | $0.00 | 2013-10-09 10:51:10 |
2 | 1000 | $12.60 | 2013-10-09 10:51:22 | $12.60
4 | 1000 | $16.80 | 2013-10-09 10:51:42 | $29.40
5 | 1000 | $100.00 | 2013-10-09 10:51:49 | $129.40
6 | 1000 | $200.00 | 2013-10-09 10:56:35 | $329.40
7 | 1000 | $50.45 | 2013-10-09 10:57:23 | $379.85
8 | 1000 | $75.50 | 2013-10-09 10:57:31 | $455.35
9 | 1000 | -$55.30 | 2013-10-09 10:59:28 | $400.05
10 | 1000 | -$200.00 | 2013-10-09 10:59:44 | $200.05
(9 rows)
網(wǎng)云數(shù)據(jù)后臺(tái)可以直接連接數(shù)據(jù)庫(kù),上傳數(shù)據(jù)庫(kù)也很快
操作步驟
登錄網(wǎng)云數(shù)據(jù)控制臺(tái)-找到云虛擬主機(jī)-云虛擬主機(jī)管理。
選擇想要重設(shè)數(shù)據(jù)庫(kù)密碼或數(shù)據(jù)庫(kù)FTP密碼的云虛擬主機(jī),點(diǎn)擊管理,進(jìn)入虛擬主機(jī)的詳情頁(yè)。
進(jìn)入數(shù)據(jù)庫(kù)的詳情頁(yè)。
在基本信息欄點(diǎn)擊修改數(shù)據(jù)庫(kù)密碼或數(shù)據(jù)庫(kù)FTP密碼。
輸入新密碼。
數(shù)據(jù)庫(kù)升級(jí)、續(xù)費(fèi)
數(shù)據(jù)庫(kù)空間屬于云虛擬主機(jī)贈(zèng)送,如需對(duì)數(shù)據(jù)庫(kù)進(jìn)行升級(jí)或續(xù)費(fèi)操作,請(qǐng)前往對(duì)應(yīng)的云虛擬主機(jī)進(jìn)行升級(jí)/續(xù)費(fèi)。
在記錄客戶信息的表中加一個(gè)續(xù)費(fèi)日期,記錄這個(gè)用戶在什么日期需要續(xù)費(fèi),在每次客戶續(xù)費(fèi)的時(shí)候update這個(gè)字段,比如周期30天,就把當(dāng)天日期+30后記錄在里面,然后做個(gè)“查詢續(xù)費(fèi)日期”的頁(yè)面,這個(gè)頁(yè)面打開后,按續(xù)費(fèi)日期order by排序,然后顯示的時(shí)候把續(xù)費(fèi)日期字段值-當(dāng)前日期值,就可以顯示出所有用戶哪些需要續(xù)費(fèi)了,哪些還剩多少時(shí)間.
單表一億?還是全庫(kù)1億?
1.首先可以考慮業(yè)務(wù)層面優(yōu)化,即垂直分表。
垂直分表就是把一個(gè)數(shù)據(jù)量很大的表,可以按某個(gè)字段的屬性或使用頻繁程度分類,拆分為多個(gè)表。
如有多種業(yè)務(wù)類型,每種業(yè)務(wù)類型入不同的表,table1,table2,table3.
如果日常業(yè)務(wù)不需要使用所有數(shù)據(jù),可以按時(shí)間分表,比如說月表。每個(gè)表只存一個(gè)月記錄。
2.架構(gòu)上的優(yōu)化,即水平分表。
水平分表就是根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到多個(gè)獨(dú)立的表里,這里不具備業(yè)務(wù)意義。
如按照id分表,末尾是0-9的數(shù)據(jù)分別插入到10個(gè)表里面。
可能你要問,這樣看起來和剛才說的垂直分表沒什么區(qū)別。只不過是否具備業(yè)務(wù)意義的差異,都是按字段的值來分表。
實(shí)際上,水平分表現(xiàn)在最流行的實(shí)現(xiàn)方式,是通過水平分庫(kù)來實(shí)現(xiàn)的。即剛才所說的10個(gè)表,分布在10個(gè)mysql數(shù)據(jù)庫(kù)上。這樣可以通過多個(gè)低配置主機(jī)整合起來,實(shí)現(xiàn)高性能。
最常見的解決方案是cobar,這個(gè)帖子介紹的比較完善,可以看看。
cobar的邏輯層次圖:
不過這種分庫(kù)方式也是有一定局限性的,需要應(yīng)用程序做相應(yīng)的配合,比如說分庫(kù)的情況下,雖然可以實(shí)現(xiàn)跨庫(kù)查詢,但是不能進(jìn)行相關(guān)的group?by計(jì)算。
另外,之前關(guān)于水平分表的實(shí)現(xiàn)方式,也可以通過表分區(qū)來實(shí)現(xiàn)。
mysql優(yōu)化的方式有很多,選擇上主要還是要考慮個(gè)人的實(shí)際情況,如代碼不可控的情況下,就不適合選擇按字段屬性分表的情況,這樣可能會(huì)帶來大量的重構(gòu)以及很多不可預(yù)期的風(fēng)險(xiǎn)。
而架構(gòu)的優(yōu)化,雖然對(duì)應(yīng)用是透明的,但對(duì)sql的寫法有很多局限性,比如說不能使用聚合函數(shù)等等,同時(shí)也需要有充足的硬件資源,只有一臺(tái)服務(wù)器的情況下是沒有意義的。
相比起來,代價(jià)最低的是按時(shí)間分表或分區(qū),這兩種辦法對(duì)應(yīng)用來說都是透明的。
分區(qū)只需要一次本地?cái)?shù)據(jù)遷移的操作。
而通過分表把現(xiàn)網(wǎng)數(shù)據(jù)和歷史數(shù)據(jù)分離,唯一的代價(jià)是定期的數(shù)據(jù)維護(hù)。
一般如果表里面有1億數(shù)據(jù)的情況下,索引的問題應(yīng)該是常識(shí)了,這方面我就不說了。
另外如果覺得答的不錯(cuò)多給點(diǎn)分。
Log File物理結(jié)構(gòu)
從 ib_logfile0和 ib_logfile1這兩個(gè)文件的物理結(jié)構(gòu)可以看出,在Log Header部分還是有些許差異的, ib_logfile0會(huì)多一些額外的信息,主要是checkpoint信息。
并且每個(gè)Block的單位是512字節(jié),對(duì)應(yīng)到磁盤每個(gè)扇區(qū)也是512字節(jié),因此redo log寫磁盤是原子寫,保證能夠?qū)懗晒Γ幌駃ndex page一樣需要double write來保證安全寫入。
我們依次從上到下來看每個(gè)Block的結(jié)構(gòu)
Log File Header Block
Log Goup ID,可能會(huì)配置多個(gè)redo組,每個(gè)組對(duì)應(yīng)一個(gè)id,當(dāng)前都是0,占用4字節(jié)
Start LSN,這個(gè)redo log文件開始日志的lsn,占用8字節(jié)
Log File Number,總是為0,占用4字節(jié)
Created By,備份程序所占用的字節(jié)數(shù),占用32字節(jié)
另外在ib_logfile0中會(huì)有兩個(gè)checkpoint block,分別是 LOG_CHECKPOINT_1/ LOG_CHECKPOINT_2,兩個(gè)記錄InnoDB Checkpoint信息的字段,分別從文件頭的第二個(gè)和第四個(gè)block開始記錄,并且只在每組log的第一個(gè)文件中存在,組內(nèi)其他文件雖然沒有checkpoint相關(guān)信息,但是也會(huì)預(yù)留相應(yīng)的空間出來。這里為什么有兩個(gè)checkpoint的呢?原因是設(shè)計(jì)為交替寫入,避免因?yàn)榻橘|(zhì)失敗而導(dǎo)致無法找到可用的checkpoint的情況。
Log blocks
請(qǐng)點(diǎn)擊輸入圖片描述
log block結(jié)構(gòu)分為日志頭段、日志記錄、日志尾部
Block Header,占用12字節(jié)
Data部分
Block tailer,占用4字節(jié)
Block Header
這個(gè)部分是每個(gè)Block的頭部,主要記錄的塊的信息
Block Number,表示這是第幾個(gè)block,占用4字節(jié),是通過LSN計(jì)算得來的,占用4字節(jié)
Block data len,表示該block中有多少字節(jié)已經(jīng)被使用了,占用2字節(jié)
First Rec offet,表示該block中作為第一個(gè)新的mtr開始的偏移量,占用2字節(jié)
Checkpoint number,表示該log block最后被寫入時(shí)的檢查點(diǎn)的值,占用4字節(jié)