mysql分庫分表一般有如下場(chǎng)景
創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作與策劃設(shè)計(jì),江安網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:江安等地區(qū)。江安做網(wǎng)站價(jià)格咨詢:18980820575
其中1,2相對(duì)較容易實(shí)現(xiàn),本文重點(diǎn)講講水平拆表和水平拆庫,以及基于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)景:以下我們基于博客文章表分庫場(chǎng)景來分析
目標(biāo):
表結(jié)構(gòu)如下(節(jié)選部分字段):
按照user_id sharding
假如分1024個(gè)庫,按照user_id % 1024 hash
user_id % 1024 = 1 分到db_001庫
user_id % 1024 = 2 分到db_002庫
依次類推
目前是2個(gè)節(jié)點(diǎn),假如后期達(dá)到瓶頸,我們可以增加至4個(gè)節(jié)點(diǎn)
最多可以增加只1024個(gè)節(jié)點(diǎn),性能線性增長(zhǎng)
對(duì)于水平分表/分庫后,非shardingKey查詢首先得考慮到
基于mybatis分庫分表,一般常用的一種是基于spring AOP方式, 另外一種基于mybatis插件。其實(shí)兩種方式思路差不多。
為了比較直觀解決這個(gè)問題,我分別在Executor 和StatementHandler階段2個(gè)攔截器
實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源獲取接口
測(cè)試結(jié)果如下
由此可知,我們需要在Executor階段 切換數(shù)據(jù)源
對(duì)于分庫:
原始sql:
目標(biāo)sql:
其中定義了三個(gè)注解
@useMaster 是否強(qiáng)制讀主
@shardingBy 分片標(biāo)識(shí)
@DB 定義邏輯表名 庫名以及分片策略
1)編寫entity
Insert
select
以上順利實(shí)現(xiàn)mysql分庫,同樣的道理實(shí)現(xiàn)同時(shí)分庫分表也很容易實(shí)現(xiàn)。
此插件具體實(shí)現(xiàn)方案已開源:
目錄如下:
mysql分庫分表,首先得找到瓶頸在哪里(IO or CPU),是分庫還是分表,分多少?不能為了分庫分表而拆分。
原則上是盡量先垂直拆分 后 水平拆分。
以上基于mybatis插件分庫分表是一種實(shí)現(xiàn)思路,還有很多不完善的地方,
例如:
第一階段:
1,一定要正確設(shè)計(jì)索引
2,一定要避免SQL語句全表掃描,所以SQL一定要走索引(如:一切的 != 等等之類的寫法都會(huì)導(dǎo)致全表掃描)
3,一定要避免 limit 10000000,20 這樣的查詢
4,一定要避免 LEFT JOIN 之類的查詢,不把這樣的邏輯處理交給數(shù)據(jù)庫
5,每個(gè)表索引不要建太多,大數(shù)據(jù)時(shí)會(huì)增加數(shù)據(jù)庫的寫入壓力
第二階段:
1,采用分表技術(shù)(大表分小表)
a)垂直分表:將部分字段分離出來,設(shè)計(jì)成分表,根據(jù)主表的主鍵關(guān)聯(lián)
b)水平分表:將相同字段表中的記錄按照某種Hash算法進(jìn)行拆分多個(gè)分表
2,采用mysql分區(qū)技術(shù)(必須5.1版以上,此技術(shù)完全能夠?qū)筄racle),與水平分表有點(diǎn)類似,但是它是在邏輯層進(jìn)行的水平分表
第三階段(服務(wù)器方面):
1,采用memcached之類的內(nèi)存對(duì)象緩存系統(tǒng),減少數(shù)據(jù)庫讀取操作
2,采用主從數(shù)據(jù)庫設(shè)計(jì),分離數(shù)據(jù)庫的讀寫壓力
3,采用Squid之類的代理服務(wù)器和Web緩存服務(wù)器技術(shù)
PS:由于篇幅問題,我只簡(jiǎn)單說一些基本概念,其實(shí)里面每個(gè)知識(shí)點(diǎn)關(guān)系到的內(nèi)容都很多。特別是第一階段,很多工作幾年的程序員,都不能完全理解。我覺得要真正理解索引,最好的辦法就是在1000W-億級(jí)以上的數(shù)據(jù),進(jìn)行測(cè)試SQL語句,再結(jié)合 explain 命令進(jìn)行查看SQL語句索引情況。
理論上是可以的,但效率上就有問題了,這么大量的數(shù)據(jù)一般不會(huì)放一張表里面,都會(huì)考慮分表,然后考慮索引、數(shù)據(jù)庫主從、服務(wù)器配置等,提高查詢效率php+mysql可以處理億級(jí)的數(shù)據(jù)嗎
1、使用用索引
注意有些情況下不能夠使用索引來提高Order By語句的查詢性能。
這里需要注意的是,并不是任何情況下都能夠通過使用索引來提高Order Byz子句的查詢效率。如對(duì)不同的關(guān)鍵字使用這個(gè)語句、混合使用ASC模式和DESC模式、用于查詢條件的關(guān)鍵字與Order By語句中所使用的關(guān)鍵字不同、對(duì)關(guān)鍵字的非連續(xù)元素使用Order By子句、在同一條語句中使用不同的Order BY 和Group BY表達(dá)式、使用的表索引的類型不能夠按順序來保存行等情況,就無法通過使用索引來解決Order By語句的排序問題。此時(shí)就需要另想他法。如可以重新調(diào)整表結(jié)構(gòu)或者查詢語句,以滿足使用這個(gè)特性的特定條件。
通常情況下,為了避免使用Order By語句導(dǎo)致的查詢速度變慢的問題,先是需要考慮使用索引來解決問題。如果不能夠通過索引來解決問題,那么可以通過緩存在一定程度來緩解。如可以增加soft_buffer_size變量的大小、根據(jù)實(shí)際情況調(diào)整Read_buffer_size變量的大小、更改tmpdir目錄將其指向具有大量空閑空間的專用文件系統(tǒng)等等。有時(shí)候管理員可以使用這個(gè)特性將負(fù)載均勻分布到多個(gè)目錄中去。
2、使用Explain關(guān)鍵字來確認(rèn)是否可以通過索引來解決Order BY速度問題。
如可以通過使用explain select * from ad_user where is_active='Y' order by value(即在常規(guī)的查詢語句前面加上一個(gè)explain關(guān)鍵字),用來判斷是否可以使用索引來提高查詢的效率。
判斷的方法是:如果這個(gè)查詢語句中,有一個(gè)using filesort這個(gè)字段,那么就非常的抱歉,無法通過使用索引來提高這個(gè)語句的查詢效率。反之,沒有這個(gè)字段,則說明可以通過索引來提高查詢效率。
3、分頁優(yōu)化
分頁程序原理很簡(jiǎn)單,這里就不多說了。
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)方式,是通過水平分庫來實(shí)現(xiàn)的。即剛才所說的10個(gè)表,分布在10個(gè)mysql數(shù)據(jù)庫上。這樣可以通過多個(gè)低配置主機(jī)整合起來,實(shí)現(xiàn)高性能。
文章名稱:mysql億級(jí)怎么處理 mysql怎么快速刪除億級(jí)數(shù)據(jù)
文章出自:http://m.kartarina.com/article34/hjjcse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、電子商務(wù)、虛擬主機(jī)、動(dòng)態(tài)網(wǎng)站、、網(wǎng)站改版
聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)