zoukankan      html  css  js  c++  java
  • MySQL分库分表

    分库分表,顾名思义,就是把原本存储于一个库一张表的数据分块存储到多个库多张表上。对于大型互联网应用来说,当一张表的数据量达到百万、千万时,数据库每执行一次查询所花的时间会变多,并且数据库面临着极高的并发访问。通过分库分表,使数据均衡地分布到多张表中,可以缩短数据查询所需要的时间,提高数据库的吞吐,减轻数据库压力。

    一、垂直切分
    将表按照功能模块、关系密切程度划分出来,部署到不同的库上。常见的分成6大库:
    1)用户类库:用于保存了用户的相关信息。例如:db_user,db_system,db_company等。
    2)业务类库:用于保存主要业务的信息。比如主要业务是订单,用这个库保存订单业务。例如:db_order等。
    3)内存类库:主要用Mysql的内存引擎。前台的数据从内存库中查找,速度快。例如:heap。
    4)图片类库:主要保存图片的索引以及关联。例如:db_img_index,db_img_res。
    5)日志类库:记录点击,刷新,登录等日志信息。例如:db_log_click,db_log_fresh,db_log_login。
    6)统计类库:对业务的统计,比如点击量,刷新量等等。例如db_stat。
    1、垂直分表
    垂直分表,通俗的说法叫做“大表拆小表”,基于关系型数据库中的“列”(字段)进行拆分。
    通常情况,某个表中的字段比较多,可以新建立一张“扩展表”,将不经常使用或者长度较大的字段拆分出去放到“扩展表”中,每个表里面的数据记录数一般情况下是相同的,只是字段不一样。
    2、垂直分库
    垂直分库就是依据业务功能的不同,划分为不同的业务库。
    比如:一个数据库里面既存在用户数据,又存在订单数据,还有产品数据,那么垂直拆分可以把用户数据放到用户库、把订单数据放到订单库、把产品数据放到产品库。
    二、水平拆分
    当一个表中的数据量过大时,可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表和不同的库上。
    1、水平分表
    水平分表也称为横向分表,就是将表中不同的数据行按照一定规律分布到不同的数据库表中(仍在同一个数据库中),这样来降低单表数据量,优化查询性能。
    比如:有一张用户表user,由于记录条数太多,将其拆分成256张表,拆分的记录根据user_id%256取得对应的表进行存储,比如user_id为10001,10001%256=17,则user_id为10001的数据存在表user17中。
    2、水平分库
    与分表策略相似,分库也可以采用通过一个关键字段取模的方式,来对数据访问进行路由。
    三、垂直水平拆分
    垂直水平拆分,是综合了垂直和水平拆分方式的一种混合方式,垂直拆分把不同类型的数据存储到不同库中,再结合水平拆分,使单表数据量保持在合理范围内,扩展系统的并发处理能力,提升单表的查询性能。
     
    一种分库分表的路由策略如下(假设采用user_id作为路由字段):
    中间变量=user_id% (库数量x每个库的表数量)
    =取整(中间变量/每个库的表数量)
    =中间变量%每个库的表数量
    假设将原来的单库单表order拆分成256个库,每个库包含1024个表,那么按照前面所提到的路由策略,对于user_id=262145的访问,路由的计算过程如下:
    • 中间变量=262145% (256X1024) =1;
    • 库=取整(1/1024) =0;
    • 表=1%1024=1。
    这意味着,对于user_id=262145的订单记录的查询和修改,将被路由到第0个库的第1个表中执行。
  • 相关阅读:
    字符串哈希
    codeforces#766 D. Mahmoud and a Dictionary (并查集)
    莫比乌斯反演模板
    马拉车模板
    codeforces#580 D. Kefa and Dishes(状压dp)
    1076E
    448C
    543A
    295B
    poj3974 Palindrome
  • 原文地址:https://www.cnblogs.com/sunshineliulu/p/7647077.html
Copyright © 2011-2022 走看看