一、查詢mysql表是否為分區(qū)表:可以查看表具有哪幾個(gè)分區(qū)、分區(qū)的方法、分區(qū)中數(shù)據(jù)的記錄數(shù)等信息
臨翔網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='xw_coobill_order';
二、查詢表有多少個(gè)分區(qū)
SELECT TABLE_NAME, COUNT(*) AS CNT
FROM information_schema.PARTITIONS WHERE PARTITION_NAME IS NOT NULL
GROUP BY TABLE_NAME ORDER BY CNT DESC LIMIT 50;
三、分析執(zhí)行語句
explain partitions select * from range_datetime where hiredate = '20151207124503' and hiredate='20151210111230';
四、分區(qū)管理
常規(guī)HASH和線性HASH的增加收縮分區(qū)的原理是一樣的。增加和收縮分區(qū)后原來的數(shù)據(jù)會根據(jù)現(xiàn)有的分區(qū)數(shù)量重新分布。HASH分區(qū)不能刪除分區(qū),所以不能使用DROP PARTITION操作進(jìn)行分區(qū)刪除操作;
只能通過ALTER TABLE ... COALESCE PARTITION num來合并分區(qū),這里的num是減去的分區(qū)數(shù)量;
可以通過ALTER TABLE ... ADD PARTITION PARTITIONS num來增加分區(qū),這里是null是在原先基礎(chǔ)上再增加的分區(qū)數(shù)量。
mysql分庫分表一般有如下場景
其中1,2相對較容易實(shí)現(xiàn),本文重點(diǎn)講講水平拆表和水平拆庫,以及基于mybatis插件方式實(shí)現(xiàn)水平拆分方案落地。
在 《聊一聊擴(kuò)展字段設(shè)計(jì)》 一文中有講解到基于KV水平存儲擴(kuò)展字段方案,這就是非常典型的可以水平分表的場景。主表和kv表是一對N關(guān)系,隨著主表數(shù)據(jù)量增長,KV表最大N倍線性增長。
這里我們以分KV表水平拆分為場景
對于kv擴(kuò)展字段查詢,只會根據(jù)id + key 或者 id 為條件的方式查詢,所以這里我們可以按照id 分片即可
分512張表(實(shí)際場景具體分多少表還得根據(jù)字段增加的頻次而定)
分表后表名為kv_000 ~ kv_511
id % 512 = 1 .... 分到 kv_001,
id % 512 = 2 .... 分到 kv_002
依次類推!
水平分表相對比較容易,后面會講到基于mybatis插件實(shí)現(xiàn)方案
場景:以下我們基于博客文章表分庫場景來分析
目標(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),性能線性增長
對于水平分表/分庫后,非shardingKey查詢首先得考慮到
基于mybatis分庫分表,一般常用的一種是基于spring AOP方式, 另外一種基于mybatis插件。其實(shí)兩種方式思路差不多。
為了比較直觀解決這個(gè)問題,我分別在Executor 和StatementHandler階段2個(gè)攔截器
實(shí)現(xiàn)動態(tài)數(shù)據(jù)源獲取接口
測試結(jié)果如下
由此可知,我們需要在Executor階段 切換數(shù)據(jù)源
對于分庫:
原始sql:
目標(biāo)sql:
其中定義了三個(gè)注解
@useMaster 是否強(qiáng)制讀主
@shardingBy 分片標(biāo)識
@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)思路,還有很多不完善的地方,
例如:
我寫了一下你看看吧
select t1.*,t2.*,t3.*(我不知道你要什么字段,所以就全部顯示了,也可以根據(jù)你的需要添加字段)
from a1 t1
, a2 t2
, a3 t3
where t1.user_id = t2.user_id(主鍵或外鍵:根據(jù)實(shí)際表的字段連接)
and t2.user_id = t3.user_id(主鍵或外鍵:根據(jù)實(shí)際表的字段連接)
and t1.name = '張三'
;
上面我只是舉個(gè)例子,如果你連表的字段信息都不知道,那我也沒有辦法,本人只會這些。
當(dāng)業(yè)務(wù)上按照月份分表,但是前端h5需要分頁展示,小伙伴們不知有沒有遇到這個(gè)這個(gè)需求最后怎么完成的。
我這里想了一個(gè)解決思路,可能還不完善,希望能拋轉(zhuǎn)引玉。
1、入?yún)ageNo 為頁號碼,如果為1那么就是第一頁。pageSize 可以是入?yún)⒁部啥ㄋ?,這里定死10條。Limit 是數(shù)據(jù)偏移標(biāo)記,根據(jù)入?yún)ageNo 計(jì)算出來的,Limit=(pageNo-1)*pageSize。假設(shè)A表有41條數(shù)據(jù)符合,B表有51條數(shù)據(jù)符合,如下圖。
有幾種種情況? ?1.如果limitA表41條 那么需要從A表中取數(shù)據(jù),(1)如果Limit+pageSizeCount直接獲取數(shù)據(jù)即可(2)如果Limit+pageSizeCount,那么需要從A 表取部分?jǐn)?shù)據(jù)從B表取一部分?jǐn)?shù)據(jù)。
1.如果limitA表41條? 那么需要從B表取數(shù)據(jù),如果B數(shù)據(jù)依然不足,那么重復(fù)以上的步驟。如下圖
網(wǎng)站欄目:mysql分庫怎么查分表 mysql分表查詢方式
本文鏈接:http://jinyejixie.com/article6/dohhgog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站策劃、網(wǎng)站改版、網(wǎng)頁設(shè)計(jì)公司、App開發(fā)、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)