首頁  >  文章  >  資料庫  >  mysql分庫後怎麼查詢

mysql分庫後怎麼查詢

(*-*)浩
(*-*)浩原創
2019-05-28 17:38:077307瀏覽

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

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查询

以上是mysql分庫後怎麼查詢的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

相關文章

看更多