在线不卡日本ⅴ一区v二区_精品一区二区中文字幕_天堂v在线视频_亚洲五月天婷婷中文网站

  • <menu id="lky3g"></menu>
  • <style id="lky3g"></style>
    <pre id="lky3g"><tt id="lky3g"></tt></pre>

    給小白演示 分庫(kù)分表案例

    給小白演示 分庫(kù)分表案例

    受群里小伙伴之邀,搞一個(gè)分庫(kù)分表案例,這樣讓很多沒(méi)用過(guò)分庫(kù)分表的心里也有個(gè)底,不然永遠(yuǎn)看到的都是網(wǎng)上的各種概念和解決方案性的文章。

    需求

    由于用戶表過(guò)于龐大,采取相關(guān)SQL優(yōu)化,還是不能滿足,所以現(xiàn)對(duì)其進(jìn)行做分庫(kù)分表。

    數(shù)據(jù)庫(kù):my-sharding

    數(shù)據(jù)庫(kù)表:t_user

    表語(yǔ)句如下:

    DROP TABLE IF EXISTS `t_user`;CREATE TABLE `t_user` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int NOT NULL, `gender` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

    關(guān)于數(shù)據(jù)庫(kù)分庫(kù)分表通常有兩種方案:

    • 垂直拆分
    • 水平拆分

    下面我們來(lái)演示水平拆分,大致思路:

    通過(guò)t_user表的id進(jìn)行hash,然后再和數(shù)據(jù)庫(kù)個(gè)數(shù)進(jìn)行取模,得出對(duì)應(yīng)數(shù)據(jù)庫(kù)。

    通過(guò)hash值和每個(gè)數(shù)據(jù)庫(kù)中表的個(gè)數(shù)進(jìn)行取模,得出對(duì)應(yīng)表名。

    創(chuàng)建數(shù)據(jù)庫(kù)和表

    加入有2000萬(wàn)條數(shù)據(jù),那么為了方便演示,我們就暫定分為五個(gè)庫(kù),每個(gè)數(shù)據(jù)庫(kù)對(duì)應(yīng)五個(gè)表。

    理想狀態(tài):2000萬(wàn)/5/4,那么每個(gè)數(shù)據(jù)庫(kù)分得400萬(wàn),每個(gè)表分得80萬(wàn)。

    總之,分庫(kù)分表后,我們的每一張表的數(shù)據(jù)庫(kù)和表都與之前的確實(shí)不是一個(gè)量級(jí)了。

    五個(gè)數(shù)據(jù)庫(kù):

    每個(gè)數(shù)據(jù)庫(kù)有五張表:

    建表語(yǔ)句如下:

    DROP TABLE IF EXISTS `t_user_0`;CREATE TABLE `t_user_0` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int NOT NULL, `gender` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `t_user_1`;CREATE TABLE `t_user_1` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int NOT NULL, `gender` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `t_user_2`;CREATE TABLE `t_user_2` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int NOT NULL, `gender` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `t_user_3`;CREATE TABLE `t_user_3` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int NOT NULL, `gender` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;DROP TABLE IF EXISTS `t_user_4`;CREATE TABLE `t_user_4` ( `id` bigint NOT NULL AUTO_INCREMENT, `user_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `age` int NOT NULL, `gender` int NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

    項(xiàng)目創(chuàng)建

    使用技術(shù)棧:JDK8+MySQL+Spring Boot +Mybatis +Shardingsphere +Druid

    maven 相關(guān)依賴:

    org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.0 org.mybatis mybatis 3.5.2 mysql mysql-connector-java 8.0.16 runtime com.github.pagehelper pagehelper-spring-boot-starter 1.2.3 org.springframework.boot spring-boot-starter-test test org.apache.shardingsphere sharding-jdbc-spring-boot-starter 4.0.1 com.alibaba druid 1.1.17 com.google.guava guava 29.0-jre

    配置文件相關(guān)配置如下:

    server.port=9002mybatis.mapper-locations=classpath:/mapper/*.xml# mybatis.type-aliases-package=com.neutral.idmapping.dbshard.pojo##### 連接池配置 ######## 過(guò)濾器設(shè)置(第一個(gè)stat很重要,沒(méi)有的話會(huì)監(jiān)控不到SQL)spring.datasource.druid.filters=stat,wall,log4j2##### WebStatFilter配置 ########啟用StatFilterspring.datasource.druid.web-stat-filter.enabled=true#添加過(guò)濾規(guī)則spring.datasource.druid.web-stat-filter.url-pattern=/*#排除一些不必要的urlspring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*#開(kāi)啟session統(tǒng)計(jì)功能spring.datasource.druid.web-stat-filter.session-stat-enable=true#缺省sessionStatMaxCount是1000個(gè)spring.datasource.druid.web-stat-filter.session-stat-max-count=1000#spring.datasource.druid.web-stat-filter.principal-session-name=#spring.datasource.druid.web-stat-filter.principal-cookie-name=#spring.datasource.druid.web-stat-filter.profile-enable=##### StatViewServlet配置 ########啟用內(nèi)置的監(jiān)控頁(yè)面spring.datasource.druid.stat-view-servlet.enabled=true#內(nèi)置監(jiān)控頁(yè)面的地址spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*#關(guān)閉 Reset All 功能spring.datasource.druid.stat-view-servlet.reset-enable=false#設(shè)置登錄用戶名spring.datasource.druid.stat-view-servlet.login-username=admin#設(shè)置登錄密碼spring.datasource.druid.stat-view-servlet.login-password=adminspring.shardingsphere.props.sql.show=false#數(shù)據(jù)庫(kù)名spring.shardingsphere.datasource.names=dp0,dp1,dp2,dp3,dp4#datasourcespring.shardingsphere.datasource.dp0.type=com.alibaba.druid.pool.DruidDataSourcespring.shardingsphere.datasource.dp0.driver-class-name=com.mysql.jdbc.Driverspring.shardingsphere.datasource.dp0.url=jdbc:mysql://localhost:3306/my-sharding_0?useUnicode=true&characterEncoding=utf-8&serverTimeZone=CTT&allowPublicKeyRetrieval=true&serverTimezone=UTCspring.shardingsphere.datasource.dp0.username=rootspring.shardingsphere.datasource.dp0.password=123456 ———-相同的代碼部分這里就不貼了——-# 對(duì)應(yīng) dp1、dp2、dp3、dp4 和上面dp0配置類似,不一樣的就是數(shù)據(jù)庫(kù)名字不一樣# 因?yàn)槲沂褂玫谋镜貏?chuàng)建多個(gè)數(shù)據(jù)庫(kù)演示的,這里就沒(méi)有必要重復(fù)累贅了#actual-data-nodes#這里是配置所有的 庫(kù).表 的集合#比如我這里配置的意思是 dp0.data_0 , dp0.data_1 ,dp0.data_2 , …#此縮寫方式使用了shardingsphere 官方推薦的語(yǔ)法#t_user 邏輯表名 在UserMapper.xml中使用spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=dp$->{0..4}.t_user_$->{0..4}#table#設(shè)置了以data中字段id作為分表的標(biāo)準(zhǔn),這樣到時(shí)候就會(huì)將id作為參數(shù)傳入到下面配置的我們自定義的分表方法中做具體操spring.shardingsphere.sharding.tables.t_user.table-strategy.standard.sharding-column=idspring.shardingsphere.sharding.tables.t_user.table-strategy.standard.precise-algorithm-class-name=com.tian.shardingdemo.common.TableShardingAlgorithm#database#設(shè)置了以data中字段id作為分庫(kù)的標(biāo)準(zhǔn),這樣到時(shí)候就會(huì)將id作為參數(shù)傳入到下面配置的我們自定義的分庫(kù)方法中做具體操作spring.shardingsphere.sharding.tables.t_user.database-strategy.standard.sharding-column=idspring.shardingsphere.sharding.tables.t_user.database-strategy.standard.precise-algorithm-class-name=com.tian.shardingdemo.common.DbShardingAlgorithm

    分庫(kù)分表的兩個(gè)分片類:

    /** * 分庫(kù) */public class DbShardingAlgorithm implements PreciseShardingAlgorithm { private Logger logger = LoggerFactory.getLogger(DbShardingAlgorithm.class); @Override public String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) { String databaseName = availableTargetNames.stream().findFirst().get(); for (String dbName : availableTargetNames) { //shardingValue.getValue()就是配置的傳入的值 //我們這里選用的是傳入sql中的id字段的值 String targetDbName= “dp” + genderToTableSuffix(shardingValue.getValue()); if (dbName.equals(targetDbName)) { //匹配到對(duì)應(yīng)的數(shù)據(jù)庫(kù),比如 dp0 //這個(gè)數(shù)據(jù)庫(kù)名對(duì)應(yīng)數(shù)據(jù)源處配置的dp0,dp1,… logger.info(“數(shù)據(jù)庫(kù)名=” + dbName); databaseName = dbName; } } return databaseName; } private String genderToTableSuffix(Long value) { //將id字段的值去hash值后去模運(yùn)算得到分庫(kù)的數(shù)字(就是一種算法而已) int i = Hashing.murmur3_128(1823977).newHasher().putString(String.valueOf(value), Charsets.UTF_8).hash().asInt(); //hash與表個(gè)數(shù)進(jìn)行取模 return String.valueOf(Math.abs(i) % 5); }}/** * 分表 */public class TableShardingAlgorithm implements PreciseShardingAlgorithm { private Logger logger = LoggerFactory.getLogger(TableShardingAlgorithm.class); @Override public String doSharding(Collection availableTargetNames, PreciseShardingValue shardingValue) { String table = availableTargetNames.stream().findFirst().get(); String targetName = “t_user_” + genderToTableSuffix(shardingValue.getValue()); for (String tableName : availableTargetNames) { //檢查計(jì)算出來(lái)的表名是否存在 if (tableName.equals(targetName)) { logger.info(“表名= ” + tableName); table = tableName; } } return table; } private String genderToTableSuffix(Long value) { //算出一個(gè)hash值 int類型 int i = Hashing.murmur3_128(8947189).newHasher().putString(String.valueOf(value), Charsets.UTF_8).hash().asInt(); //hash與表個(gè)數(shù)進(jìn)行取模 return String.valueOf(Math.abs(i) % 5); }}

    下面是業(yè)務(wù)部分代碼,先看UserMapper.xml內(nèi)容:

    INSERT INTO t_user (id, user_name,age,gender) VALUES ( #{id},#{userName},#{age},#{gender} ); select * from t_user id = #{id} update t_user `user_name` = #{userName}, gender = #{gender}, age = #{age}, where id=#{id}

    UserMapper接口:

    import com.tian.shardingdemo.entity.User;import org.apache.ibatis.annotations.Mapper;import org.apache.ibatis.annotations.Param;import org.springframework.stereotype.Repository;@Mapper@Repositorypublic interface UserMapper { User selectUserById(@Param(“id”) Long id); int updateAuthorIfNecessary(User user); int insert(User user);}

    為了更好地演示,我這里加入了controller層和service層,這也是大家平常開(kāi)發(fā)套路。

    service層代碼如下:

    public interface IUserService { User selectUserById(Long id); void add(Long id);}@Servicepublic class UserServiceImpl implements IUserService { @Resource private UserMapper userMapper; @Override public User selectUserById(Long id) { return userMapper.selectUserById(id); } @Override public void add(Long id) { User user = new User(); user.setAge(22); user.setGender(1); user.setId(id); user.setUserName(“tian” + id); userMapper.insert(user); }}

    controller層代碼如下:

    @RestController@RequestMappingpublic class UserController { @Resource private IUserService userService; @RequestMapping(value = “/user/{id}”, method = RequestMethod.GET) public User selectUserById(@PathVariable(“id”) Long id) { return userService.selectUserById(id); } @PostMapping(“/add”) public Object add(@RequestBody Map params) { Long id = params.get(“id”); userService.add(id); return “ok”; }}

    最后是項(xiàng)目的啟動(dòng)類:

    @SpringBootApplication@MapperScan({“com.tian.shardingdemo.mapper”})public class ShardingDemoApplication { public static void main(String[] args) { SpringApplication.run(ShardingDemoApplication.class, args); }}

    啟動(dòng)項(xiàng)目,啟動(dòng)成功:

    下面我們來(lái)演示一下新增數(shù)據(jù)和查詢。

    添加數(shù)據(jù)到數(shù)據(jù)庫(kù)中

    先來(lái)添加數(shù)據(jù)到數(shù)據(jù)庫(kù)中,這里使用的是IDEA中restful工具:

    后臺(tái)日志

    再查看數(shù)據(jù)庫(kù)表中:

    到此,我們的數(shù)據(jù)依舊落庫(kù),下面我們來(lái)演示一下數(shù)據(jù)查詢。

    數(shù)據(jù)查詢

    瀏覽器里輸入:

    http://localhost:9002/user/7

    返回?cái)?shù)據(jù):

    {“id”:7,”userName”:”tian7″,”age”:22,”gender”:1}

    后臺(tái)日志:

    從日志和返回結(jié)果可以看出,已經(jīng)為我們正確的選擇到對(duì)應(yīng)的數(shù)據(jù)庫(kù)和表了,這樣,一個(gè)分庫(kù)分表的查詢就成功了。

    總結(jié)

    本文沒(méi)有太多的概念,直接使用案例演示。相關(guān)概念性的文章,還有分庫(kù)分表解決方案的文章,網(wǎng)上一堆堆的,感興趣可以自行查閱。


    鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場(chǎng),版權(quán)歸原作者所有,如有侵權(quán)請(qǐng)聯(lián)系管理員(admin#wlmqw.com)刪除。
    用戶投稿
    上一篇 2022年7月12日 15:26
    下一篇 2022年7月12日 15:26

    相關(guān)推薦

    • 30個(gè)無(wú)加盟費(fèi)的項(xiàng)目(茶顏悅色奶茶店加盟費(fèi)多少)

      茶顏悅色又爆了,8月18日,茶顏悅色南京門店正式開(kāi)業(yè),開(kāi)張不到半小時(shí),門店就人滿為患,消費(fèi)者的購(gòu)買熱情十分高漲,而由于人流量過(guò)大造成擁堵,茶顏悅色也不得不暫停營(yíng)業(yè)。 當(dāng)然,這里面排…

      2022年11月27日
    • 凈利潤(rùn)率越高越好嗎(凈利潤(rùn)率多少合適)

      一、持續(xù)增收不增利,平均凈利潤(rùn)率首次跌入個(gè)位數(shù) 2021年,增收不增利依舊是行業(yè)主流。具體來(lái)看,大部分企業(yè)營(yíng)業(yè)收入呈增長(zhǎng)態(tài)勢(shì),E50企業(yè)平均同比增速達(dá)到17.3%,但是利潤(rùn)增速則明…

      2022年11月26日
    • 規(guī)范透明促PPP高質(zhì)量發(fā)展——16萬(wàn)億元大市場(chǎng)迎來(lái)新規(guī)

      近日,財(cái)政部印發(fā)《關(guān)于進(jìn)一步推動(dòng)政府和社會(huì)資本合作(PPP)規(guī)范發(fā)展、陽(yáng)光運(yùn)行的通知》,從做好項(xiàng)目前期論證、推動(dòng)項(xiàng)目規(guī)范運(yùn)作、嚴(yán)防隱性債務(wù)風(fēng)險(xiǎn)、保障項(xiàng)目陽(yáng)光運(yùn)行四個(gè)方面進(jìn)一步規(guī)范P…

      2022年11月25日
    • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

      CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊(cè),可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來(lái)定…

      2022年11月25日
    • 推薦3種白手起家的賺錢項(xiàng)目(白手起家賺錢項(xiàng)目有哪些)

      如今社會(huì)壓力非常的大,家有老少要養(yǎng)活,這些都加速了窮人想要?jiǎng)?chuàng)業(yè)的欲望,但是創(chuàng)業(yè)路總是那么的艱難,資金就是創(chuàng)業(yè)的重頭戲,所以選擇一個(gè)低成本又賺錢的項(xiàng)目是大多數(shù)人最期望的了,那么有哪些…

      2022年11月25日
    • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點(diǎn))

      如今抖音這個(gè)短視頻的變現(xiàn)能力越來(lái)越突顯了,尤其是在平臺(tái)上開(kāi)通直播,更具有超強(qiáng)的帶貨屬性,已經(jīng)有越來(lái)越多的普通人加入到其中了。不過(guò)直播帶貨雖然很火,但是也不是每個(gè)人都能做好的,那么在…

      2022年11月24日
    • 閑魚運(yùn)營(yíng)的4大技巧解析(閑魚運(yùn)營(yíng)怎么做)

      熟悉我又來(lái)了,上一次寫的文章是爆出風(fēng)水項(xiàng)目的潛規(guī)則,但那個(gè)項(xiàng)目已經(jīng)涼涼了。 這一次我是要教一些小白,你們第一次做互聯(lián)網(wǎng)的建議做的項(xiàng)目之一,這個(gè)項(xiàng)目就是閑魚賣二手物品賺差價(jià)了!!! …

      2022年11月24日
    • 明查|美國(guó)新冠后遺癥患者中有16%癥狀嚴(yán)重以致無(wú)法工作?

      點(diǎn)擊進(jìn)入澎湃新聞全球事實(shí)核查平臺(tái) 速覽 – 網(wǎng)傳數(shù)據(jù)比例無(wú)權(quán)威信源佐證,該比例有可能是結(jié)合了美國(guó)疾病防控中心和布魯金斯學(xué)會(huì)的數(shù)據(jù)得出,但這兩個(gè)機(jī)構(gòu)的調(diào)研目的和樣本都不同…

      2022年11月24日
    • 2023年農(nóng)村創(chuàng)業(yè)最好的種植項(xiàng)目有哪些(2023年農(nóng)村宅基地)

      隨著2023年時(shí)間的臨近,有關(guān)農(nóng)村創(chuàng)業(yè)大家也都十分關(guān)注。2023年農(nóng)村創(chuàng)業(yè)最好的種植項(xiàng)目有哪些?新的一年農(nóng)村創(chuàng)業(yè)到底做什么最能賺錢呢?今天小編整理了一些非常具有發(fā)展?jié)摿Φ霓r(nóng)村種植業(yè)…

      2022年11月23日
    • 汕梅高速將改擴(kuò)建為雙向八車道 預(yù)計(jì)2026年建成通車

      昨日上午,汕梅高速改擴(kuò)建項(xiàng)目在梅州舉行建設(shè)動(dòng)員會(huì),標(biāo)志著廣東省首條山嶺重丘區(qū)高速公路改擴(kuò)建項(xiàng)目將全面開(kāi)工建設(shè)。 汕梅高速是廣東省東北部南北貨運(yùn)的重要通道,聯(lián)通粵贛閩三省,承擔(dān)著粵東…

      2022年11月23日

    聯(lián)系我們

    聯(lián)系郵箱:admin#wlmqw.com
    工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息