zoukankan      html  css  js  c++  java
  • Mysql数据库进阶之(分表分库,主从分离)

    前言:数据库的优化是一个程序员的分水岭,作为小白我也得去提前学习这方面的数据的

    (一)  三范式和逆范式

      听起范式这个迟非常专业我来举个简单的栗子:

      第一范式就是:  把能够关联的每条数据都拆分成一个表

      第二范式就是:把能够关联的每条数据写在一个表格中去

      第三范式就是:把一些重复的字段再划分多一个表来存(这样做查询数据时候只能连表来操作)给查询带来压力

      逆范式就是:宁愿牺牲一些冗余的数据把所有的字段都往一个表格里面存,这样有利于提高查询速度.

    (二)垂直分表和水平分表设计

      1.水平分表


    create table cakes ( id int unsigned primary
    key auto_increment, cakename varchar(16) )charset=utf8 partition by range(id)( #分表名称cake1000,范围是id=1 to id=999 partition cake1000 values less than(1000), #分表名称cake1000,范围是id=1000 to id=1999 partition cake2000 values less than(2000) );

    说明这里通过id标识来分表,主要表格的id如果超过了规定的值就会进入下一个表格
    //这个功能主要是用在表格已经生成了但是后面添加的
    alter table 表名 add partition (
        partition 分表名称  values  less than (范围)
    )

    //删除分表的功能
    alter table 表名 drop partition 分表名称;

      2.垂直分表

    create table goods
    (
        id int unsigned comment '不能在list分表使用索引',
        proname varchar(10) not null,
        source varchar(20) comment '原料',
        `money` varchar(10) not null,
        addtime datetime not null comment '2018-03-25 11:22:33'
    )charset=utf8 partition by list( month(addtime) )(
        partition spring values in(3,4,5), #春季
        partition summer values in(6,7,8), #夏季
        partition autumn values in(9,10,11), #秋季
        partition winter values in(12,1,2) #冬季
    );

    //注意这里是以月份进行分表的,并且id这个字段不能为主键和唯一键索引
    //这个功能主要是用在表格已经生成了但是后面添加的
    alter table 表名 add partition (
        partition 分表名称  values  in (范围)
    )

    create index normal_id on goodsYear(id); //通常都是以普通键索引来做为ID
    alter table 表名 drop partition 分表名称;

    (三) MySQL 的 Grant 用户授权

      即:在 MySQL 中默认存在一个本地用户访问的机制,其他服务器是无法访问的另一台服务器的MySQL 数据库,是会报没有权限的

    如果希望当前服务器被其他服务器访问就需要使用 Grant 用户授权技术
    //授权语句
    GRANT ALL PRIVILEGES ON *.* TO '授权用户名'@'被授权服务器的IP' IDENTIFIED BY '授权密码';
    //立即生效
    FLUSH PRIVILEGES;
    //如果授权成功效果,通过命令查看mysql中的系统用户表:
    select host,user from mysql.user where user=授权用户名
    //测试是否能在别的服务器访问本服务器的数据库
    mysql -u授权的用户名 -p授权的密码 -h访问的主机

    (四)binlog 日志

    1. show variables like 'log_bin' : 该函数主要用于查看binlog日志是否已经开启

    2. show master status : 该函数主要查看用于Master数据库正在使用的binlog日志情况

    3. show slave status G: 该函数主要用于Slave数据库是否已经同步

      以上函数如果不用于主从复制和读写分离的配置当中,等同没用

    (五)读写分离和主从复制

      1.主从首要条件:①关闭 selinux ②关闭 iptables ③ master 已经对 slave 进行 grant 授权

    create database php32 charset utf8;
    
    在 master 服务器中开启 binlog 日志和设置要发生主从同步数据库(my.cnf)
    
    #mysql的bin-log 日志配置选项,假设 做读写(主从)分离,这个选项在从服务器必须关闭
    
    log-bin=mysql-bin
    
    #1.主服务器的id,这个 id 不一定设为 1,只要主从不一样就行
    
    server-id=1
    
    #2.要做同步的数据库名字,可以是多个数据库,之间用分号分割
    
    binlog-do-db=php32

    #3.保存重启mysql
    service mysqld restart

    #4.显示状态(里面显示的数据用在从服务器使用)
    show master status;
    #从服务器
    servir-id = 2 (这里只要和主服务器不同就行了)
    #登录
    mysql -uxxx -pxxx
    #认证从服务器
    change master to master_host='主服务器的IP地址',
    master_port=3306,#端口
    master_user='xxx',#主服务器授权的用户名
    master_password='xxx',#主服务器授权的用户密码
    master_log_file='mysql-bin.000007',#主服务器上的bin-log日志
    master_log_pos=106;#主服务器上的 bin-log日志值

    #启动主从服务

    start slave;
    stop slave; -- 停止
    reset slave; -- 重置
    start slave; -- 启动

    #登录slave服务器中,查看show slave statusG,看到如下选项代表主从复制同步成功:
    show slave statusG

    最后注意:如果开发中写的操作发生slave当中,主从同步马上宣告失败,因此开发中,我们必须清楚 master 和 slave 服务器,slave 我们只是让它负责 select,但是 slave 是可以 insert 数据的,但是清楚风险所在.

    IT这条路,当你懂得越多的时候,那么你不懂的也就会越多了.
  • 相关阅读:
    luoguP3181 [HAOI2016]找相同字符
    luoguP4248 [AHOI2013]差异
    luoguP2852 [USACO06DEC]Milk Patterns
    后缀自动机
    luoguP3975 [TJOI2015]弦论
    luoguP2824 [HEOI2016/TJOI2016]排序(线段树分裂做法)
    组合数学学习笔记
    「题解」:[BZOJ2938]病毒 (AC自动机+dfs)
    Linux新人报到
    指针学习笔记
  • 原文地址:https://www.cnblogs.com/learningPHP-students2018/p/10176562.html
Copyright © 2011-2022 走看看