• MySQL优化(6):分表和读写分离


    分表

    通常指:通过应用程序层,将数据划分到不同的表中进行存储

    对比分区,分区是在服务器层完成的分区算法

    分表会导致客户端明显的改变,在服务器端出现结构相同的多张表,甚至可以把多张表分到不同的服务器上

    以账单表为例:数据库可能会有这样的情况

    create table bill201710(
    id int unsigned auto_increment primary key,
    user_ud int unsigned,
    amount decimal(10,2),
    date int
    );
    create table bill201711(
    id int unsigned auto_increment primary key,
    user_ud int unsigned,
    amount decimal(10,2),
    date int
    );
    create table bill201712(
    id int unsigned auto_increment primary key,
    user_ud int unsigned,
    amount decimal(10,2),
    date int
    );

    而是又Java等代码进行处理,区分应该选择哪一张表,根据传递的时间参数进行划分

    实际中,有一个比较麻烦的问题,主键ID的问题,理论上ID是不可以重复的

    解决方案:

    (1)代码层面,手动做一个自增ID,不稳妥

    (2)利用数据库,新建一张独立地表,一张生成ID地表

    create table billid(
    id int unsigned auto_increment primary key
    )

    在插入真正的账单之前,先去ID表取一个ID,这种方式也是常用的方式

    分表的原因:

    (1)为数据库减压

    (2)数据库分区算法的局限性,也是最重要的原因

    (3)数据的支持不完善,老版本mysql不支持分区

    分区和分表都称之为水平分割,于是有了垂直分割:

    垂直分割:

    每个表记录数量一直,但是字段不一致

    这种方式其实不是太推荐的

    无论垂直还是水平分割,本质都是把大的单位划分为小的单位

    横向扩展MySQL服务器:

    由多台MySQL服务器提供数据存储服务器

    横向扩展是从根本上提升数据库性能的手段,受限于单台计算机的性能,使用多台计算机完成同一个服务的支持

    比较典型的概念是:读写分离,负载均衡

    读写分离:

    由一部分MySQL服务器提供读操作:SELECT

    另一些MySQL服务器提供写操作:UPDATE,DELETE,INSERT

    以前有写过在Java的SSM中如何配置读写分离:

    https://www.cnblogs.com/xuyiqing/p/10648103.html

    以及在Windows中配置MySQL的主从同步:

    https://www.cnblogs.com/xuyiqing/p/10647133.html

    负载均衡:

    当存在多台服务器提供一个任务时,需要从其中选择某台完成当前任务,就是选择负载均衡

    负载均衡技术有很多,不如Nginx,Zuul等等,不过和MySQL不在一个层次

    在mysql架构中,往往采用的是一写多读的架构,这里的多台读服务器就需要做负载均衡

    典型的负载均衡算法有:平均轮询,加权轮询,负载分配

    负载均衡的实现可以用中间件,也可以在Java代码中实现

    比如SpringBoot配置多个数据源,SpringCloud多谢几个DAO层的服务,并且每个服务调用不同的数据源即可解决

  • 相关阅读:
    SQL的四种连接(内连接,外连接)
    MySQL连表操作之一对多
    [转]Mysql连表之多对多
    Hibernate笔记二
    Hibernate框架报错:org.hibernate.PropertyAccessException: IllegalArgumentException occurred while calling setter of com.mikey.hibernate.domain.Person.pid
    Hibernate框架:org.hibernate.exception.SQLGrammarException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java92)
    [转]网络编程三要素
    Hibernate笔记一
    JavaScript高级特征之面向对象笔记
    Myeclipse创建HTML文件中文显示乱码问题
  • 原文地址:https://www.cnblogs.com/miaoweiye/p/12519648.html
Copyright © 2020-2023  润新知