“mysql”達(dá)到1億級(jí)別如何設(shè)計(jì)優(yōu)化?
成都創(chuàng)新互聯(lián)公司專注于斗門網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供斗門營(yíng)銷型網(wǎng)站建設(shè),斗門網(wǎng)站制作、斗門網(wǎng)頁(yè)設(shè)計(jì)、斗門網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造斗門網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供斗門網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
1.首先可以考慮業(yè)務(wù)層面優(yōu)化,即垂直分表。
垂直分表就是把一個(gè)數(shù)據(jù)量很大的表,可以按某個(gè)字段的屬性或使用頻繁程度分類,拆分為多個(gè)表。
如有多種業(yè)務(wù)類型,每種業(yè)務(wù)類型入不同的表,table1,table2,table3.
如果日常業(yè)務(wù)不需要使用所有數(shù)據(jù),可以按時(shí)間分表,比如說(shuō)月表。每個(gè)表只存一個(gè)月記錄。
2.架構(gòu)上的優(yōu)化,即水平分表。
水平分表就是根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到多個(gè)獨(dú)立的表里,這里不具備業(yè)務(wù)意義。
如按照id分表,末尾是0-9的數(shù)據(jù)分別插入到10個(gè)表里面。
可能你要問,這樣看起來(lái)和剛才說(shuō)的垂直分表沒什么區(qū)別。只不過是否具備業(yè)務(wù)意義的差異,都是按字段的值來(lái)分表。
實(shí)際上,水平分表現(xiàn)在最流行的實(shí)現(xiàn)方式,是通過水平分庫(kù)來(lái)實(shí)現(xiàn)的。即剛才所說(shuō)的10個(gè)表,分布在10個(gè)mysql數(shù)據(jù)庫(kù)上。這樣可以通過多個(gè)低配置主機(jī)整合起來(lái),實(shí)現(xiàn)高性能。
最常見的解決方案是cobar,這個(gè)帖子介紹的比較完善,可以看看。
理論上是可以的,但效率上就有問題了,這么大量的數(shù)據(jù)一般不會(huì)放一張表里面,都會(huì)考慮分表,然后考慮索引、數(shù)據(jù)庫(kù)主從、服務(wù)器配置等,提高查詢效率php+mysql可以處理億級(jí)的數(shù)據(jù)嗎
如果單講存儲(chǔ),那只要你的硬盤夠大都可以,但如果要講效率就得想辦法,如根據(jù)年份把數(shù)據(jù)放到不同的表里,或不同的機(jī)子上,因?yàn)橐粋€(gè)表放這么多數(shù)據(jù)效率會(huì)很低的,但如果分開放又會(huì)出現(xiàn)統(tǒng)計(jì)、去重這類操作的麻煩,所以設(shè)置數(shù)據(jù)庫(kù)不能只考慮三級(jí)范式,難的是設(shè)置的有效率。
mysql分庫(kù)分表一般有如下場(chǎng)景
其中1,2相對(duì)較容易實(shí)現(xiàn),本文重點(diǎn)講講水平拆表和水平拆庫(kù),以及基于mybatis插件方式實(shí)現(xiàn)水平拆分方案落地。
在 《聊一聊擴(kuò)展字段設(shè)計(jì)》 一文中有講解到基于KV水平存儲(chǔ)擴(kuò)展字段方案,這就是非常典型的可以水平分表的場(chǎng)景。主表和kv表是一對(duì)N關(guān)系,隨著主表數(shù)據(jù)量增長(zhǎng),KV表最大N倍線性增長(zhǎng)。
這里我們以分KV表水平拆分為場(chǎng)景
對(duì)于kv擴(kuò)展字段查詢,只會(huì)根據(jù)id + key 或者 id 為條件的方式查詢,所以這里我們可以按照id 分片即可
分512張表(實(shí)際場(chǎng)景具體分多少表還得根據(jù)字段增加的頻次而定)
分表后表名為kv_000 ~ kv_511
id % 512 = 1 .... 分到 kv_001,
id % 512 = 2 .... 分到 kv_002
依次類推!
水平分表相對(duì)比較容易,后面會(huì)講到基于mybatis插件實(shí)現(xiàn)方案
場(chǎng)景:以下我們基于博客文章表分庫(kù)場(chǎng)景來(lái)分析
目標(biāo):
表結(jié)構(gòu)如下(節(jié)選部分字段):
按照user_id sharding
假如分1024個(gè)庫(kù),按照user_id % 1024 hash
user_id % 1024 = 1 分到db_001庫(kù)
user_id % 1024 = 2 分到db_002庫(kù)
依次類推
目前是2個(gè)節(jié)點(diǎn),假如后期達(dá)到瓶頸,我們可以增加至4個(gè)節(jié)點(diǎn)
最多可以增加只1024個(gè)節(jié)點(diǎn),性能線性增長(zhǎng)
對(duì)于水平分表/分庫(kù)后,非shardingKey查詢首先得考慮到
基于mybatis分庫(kù)分表,一般常用的一種是基于spring AOP方式, 另外一種基于mybatis插件。其實(shí)兩種方式思路差不多。
為了比較直觀解決這個(gè)問題,我分別在Executor 和StatementHandler階段2個(gè)攔截器
實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源獲取接口
測(cè)試結(jié)果如下
由此可知,我們需要在Executor階段 切換數(shù)據(jù)源
對(duì)于分庫(kù):
原始sql:
目標(biāo)sql:
其中定義了三個(gè)注解
@useMaster 是否強(qiáng)制讀主
@shardingBy 分片標(biāo)識(shí)
@DB 定義邏輯表名 庫(kù)名以及分片策略
1)編寫entity
Insert
select
以上順利實(shí)現(xiàn)mysql分庫(kù),同樣的道理實(shí)現(xiàn)同時(shí)分庫(kù)分表也很容易實(shí)現(xiàn)。
此插件具體實(shí)現(xiàn)方案已開源:
目錄如下:
mysql分庫(kù)分表,首先得找到瓶頸在哪里(IO or CPU),是分庫(kù)還是分表,分多少?不能為了分庫(kù)分表而拆分。
原則上是盡量先垂直拆分 后 水平拆分。
以上基于mybatis插件分庫(kù)分表是一種實(shí)現(xiàn)思路,還有很多不完善的地方,
例如:
1、數(shù)據(jù)表 collect ( id, title ,info ,vtype) 就這4個(gè)字段,其中 title 用定長(zhǎng),info 用text, id 是逐漸,vtype是tinyint,vtype是索引。這是一個(gè)基本的新聞系統(tǒng)的簡(jiǎn)單模型。現(xiàn)在往里面填充數(shù)據(jù),填充10萬(wàn)篇新聞。
2、最后collect 為 10萬(wàn)條記錄,數(shù)據(jù)庫(kù)表占用硬盤1.6G。OK ,看下面這條sql語(yǔ)句:select id,title from collect limit 1000,10; 很快;基本上0.01秒就OK,再看下面的select id,title from collect limit 90000,10; 從9萬(wàn)條開始分頁(yè)。
3、8-9秒完成。
4、看下面一條語(yǔ)句:select id from collect order by id limit 90000,10; 很快,0.04秒就OK。因?yàn)橛昧薸d主鍵做索引當(dāng)然快。
網(wǎng)站題目:億級(jí)數(shù)據(jù)怎么存mysql 千億級(jí)數(shù)據(jù)如何處理
本文鏈接:http://chinadenli.net/article48/hgogep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、品牌網(wǎng)站制作、服務(wù)器托管、品牌網(wǎng)站設(shè)計(jì)、全網(wǎng)營(yíng)銷推廣、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)