天天看點

如何找到mysql的分庫_【資料庫】mysql分庫後怎麼查詢

分庫分表的政策,依項目需求而定,這裡采用的是正常的做法:根據取模的方式,假設我們水準分庫2個,每個庫又水準拆表2個 既總共有4個表,查詢的時候預設沒有按照其他的條件進行排序,假設我們要查詢第41頁的資料,每頁顯示10條資料

如何找到mysql的分庫_【資料庫】mysql分庫後怎麼查詢

第一種:

也是最簡單的一種:通過額外的添加一張關聯表,屬性中必有id屬性,至于是否有庫id屬性和表id屬性(既第幾個庫和第幾個表)可有可無,因為這個可以根據id自行取模擷取,注意這張表存放的資料是所有資料,但是勝在屬性列少,隻有提供索引的幾個屬性列,這樣的話我們隻需要select * from brand_temp where … limit 400,10(插叙第41頁的資料,每頁顯示5條資料),然後我們擷取了id之後就可以去對應的表中查詢了

第二種:

最耗費性能的一種,如果我們要查詢第一頁的記錄,單庫單表的sql為:select * from db limit 0,10; 當我們分庫分片之後 語句還是同樣的語句,但是這時候我們需要對4個表傳回的記錄在記憶體中進行解析,然後通過id進行升序,取得前10條資料傳回…資料量小,頁碼小的時候很ok,但是如果我們要查詢第2頁的資料的時候,sql單體架構的情況下為:select * from db limit 10,10; 但是在分布式資料庫這樣是不行的,資料很明顯會丢失,彌補的方法是查詢所有,sql語句為select * from db_x limit 0,10+10 //意味着需要查詢的是本在單體架構上要查詢的記錄數加上之前的記錄 ,然後再在記憶體中合并所有表傳回的記錄然後進行解析,最後取第10開始的記錄 …可以看出這個方案一旦頁碼數達到n頁,而每頁顯示的記錄數為m條記錄的時候,每個表需要查詢的記錄數為:(n-1)*m+m=nm條記錄,記憶體中需要解析的記錄數為 t * n * m 條記錄,cpu不爆炸算我輸

第三種:

采取的是基于業務的模式:迫使使用者無法進行跳頁查詢,什麼意思呢,就是使用者隻能點選下一頁或者上一頁的方式浏覽,具體的做法在于查詢得到記錄數的同時記錄下目前唯一id值的最大值,然後再次查詢的時候添加where 條件…讓我們從頭開始捋: 第一次查詢pageNum=1,pageSize=10 ,maxId=0->sql:select * from db_x where id>0 limit 10; 然後分發到對應的庫的表中,将得到的4*10條資料合并,再在記憶體中進行解析排序,取前10條資料,同時将第10條資料的id=maxId單獨取出渲染到前端頁面上儲存,這樣當點選下一頁的時候,這個maxId=10也送出上去了,sql 變成了select * from db_x where id>10 limit 10,然後繼續解析,繼續儲存…這種方式傳回的資料都是穩定的并且資料是連貫的(排序)

第四種:

傳說中的最好的方式,支援跳頁查詢,這個方式核心在于2次sql查詢,具體怎麼做呢:

前提條件假設:查詢第1001頁的資料,每頁顯示10條記錄

1):我們先記錄下要查詢的記錄數的範圍:(1001-1)*10=10000 開始,10010結束->10000-10010

單體的sql為:select * from db limit 10000,10;

我們總共有4個表,意味着:每個表的start應該為10000/4=2500,進而sql變成了:

select * from db_x limit 2500,10;//假設是平均配置設定的,因而我們可以均分,不均分也沒關系,後續操作會補齊

我們會得到4個表中的記錄:(因為我demo還沒寫,是以先手寫了)

T1:(1,"a"),.......

T2:(2,"b"),.......

T3:(3,"c"),.......

T4:(4,"d"),.......

真實資料第1001頁不可能是1開頭的,将就着看吧,過幾天會一起講rabbitMQ分布式一緻性和這個demo一起釋出的

ok,第一階段的sql查詢結束

2):對4個表中傳回的記錄進行id比對(id如果非整型,自行用hashCode比對),因為是升序查詢,是以我們隻需要比較下每個表的首條記錄

的id值即可,獲得了最小的minId=1,和各個表最大的那個值maxId;ok,轉換sql思路,這裡我們采用條件查詢了(彌補操作第一步):

select * from db_x where id between minId and maxId 這樣我們就擷取到了遺漏的資料(當然有多餘的資料)

這樣我們4個表中就傳回了可能記錄數各不相同的記錄,第二步結束

3):

之後記錄minId出現的位置,如T1出現的位置為2500,T2出現的位置為2500-2=2048 ,T3出現的位置為2500-3=2047 ,T4出現的位置

為2500-3=2047 則最終出現的記錄數為:2500+2048+2047+2047=10000-2-3-3=9992,是以我們需要的查詢的記錄數需要從9992 依次往後取

8個開始,然後再取10個就是所求的資料,這種方式能做到資料精确查詢,但是唯一的缺點就是每次查詢都需要進行二次sql查詢