zoukankan      html  css  js  c++  java
  • mysql数据库优化--分库分表

    mysql如何调试

      1.数据库设计三范式
      2.数据库分表分库——水平分割,垂直分割
      3.定位慢查询
      4.存储过程

    mysql如何实现优化

      1.数据库设计要合理(3F)
      2.添加索引(普通索引,主键索引,唯一索引,全文索引)
      3分表分库技术(取模分表,水平分割,垂直分割)
      4.读写分离(读一个写一个减少IO量)
      5.存储过程
      6.配置MYSQL最大连接数(my.ini文件)
      7.MySQL服务器升级
      8.随时清理碎片化
      9.SQL语句调优

    分表分库

      垂直拆分

        垂直拆分就是要把表按模块划分到不同数据库表中(当然原则还是不破坏第三范式),这种拆分在大型网站的演变过程中是很常见的。当一个网站还在很小的时候,只有小量的人来开发和维护,各模块和表都在一起,当网站不断丰富和壮大的时候,也会变成多个子系统来支撑,这时就有按模块和功能把表划分出来的需求。其实,相对于垂直切分更进一步的是服务化改造,说得简单就是要把原来强耦合的系统拆分成多个弱耦合的服务,通过服务间的调用来满足业务需求看,因此表拆出来后要通过服务的形式暴露出去,而不是直接调用不同模块的表,淘宝在架构不断演变过程,最重要的一环就是服务化改造,把用户、交易、店铺、宝贝这些核心的概念抽取成独立的服务,也非常有利于进行局部的优化和治理,保障核心模块的稳定性

        垂直拆分用于分布式场景

      水平拆分

        上面谈到垂直切分只是把表按模块划分到不同数据库,但没有解决单表大数据量的问题,而水平切分就是要把一个表按照某种规则把数据划分到不同表或数据库里。例如像计费系统,通过按时间来划分表就比较合适,因为系统都是处理某一时间段的数据。而像SaaS应用,通过按用户维度来划分数据比较合适,因为用户与用户之间的隔离的,一般不存在处理多个用户数据的情况,简单的按user_id范围来水平切分

        通俗理解:水平拆分行,行数据拆分到不同表中, 垂直拆分列,表数据拆分到不同表中

    使用取模方式分表

      创建表    

    create table user0(
    id int unsigned primary key ,
    name varchar(32) not null default '',
    pwd  varchar(32) not null default '')
    engine=myisam charset utf8;
    
    create table user1(
    id int unsigned primary key ,
    name varchar(32) not null default '',
    pwd  varchar(32) not null default '')
    engine=myisam charset utf8;
    
    create table user2(
    id int unsigned primary key ,
    name varchar(32) not null default '',
    pwd  varchar(32) not null default '')
    engine=myisam charset utf8;
    
    
    create table uuid(
    id int unsigned primary key auto_increment)engine=myisam charset utf8;

      创建springboot工程

        步骤一:导入依赖

      <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.38</version>
            </dependency>
        </dependencies>

        步骤二:编写applicationContext.properties文件

    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql:///leveof
    spring.datasource.username=root
    spring.datasource.password=123

        步骤三:编写service层代码

    package com.wn.service;
    
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    
    @Service
    public class LeveService {
    
        @Resource
        private JdbcTemplate jdbcTemplate;
    
        //添加数据
        public String register(String name,String password){
            //向UUID表中插入数据
            jdbcTemplate.update("insert  into uuid values (null)");
            //取模算法
            //获取插入数据的id
            Integer id = jdbcTemplate.queryForObject("select last_insert_id()", Integer.class);
            //计算表
            String tableName="user"+id%3;
            //向分表中插入数据
            jdbcTemplate.update("insert into "+tableName+" values ('"+id+"','"+name+"','"+password+"')");
            return "success";
        }
    
        //查询数据
        public String getUser(Integer id){
            String tableName="user"+id%3;
            return jdbcTemplate.queryForObject(("select name from "+tableName),String.class);
        }
    }

        步骤四:编写controller层代码

    package com.wn.controller;
    
    import com.wn.service.LeveService;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import javax.annotation.Resource;
    
    @RestController
    public class LeveController {
    
        //植入service层对象
        @Resource
        private LeveService service;
    
        @RequestMapping("/register")
        public String register(String name,String password){
            return service.register(name,password);
        }
    
        @RequestMapping("/getUser")
        public String getUser(Integer id){
            return service.getUser(id);
        }
    
    }

        步骤五:实现效果展示

          

          每次往数据添加数据时,都会进行取模运算,将数据分发到不同的表中

          

          

     

  • 相关阅读:
    ASP.NET Core依赖注入(DI)
    SQLSERVER 创建索引视图注意事项
    Git的基本使用方法(0基础小白也能看懂)
    并发系列64章(异步编程二)第三章
    并发系列64章(异步编程)第二章
    并发系列64章(并发概要)第一章
    SQL Server配置邮件服务器
    SQL Server常用函数及命令
    SQL Server将一段字符串根据特定分隔符转换成一个表变量
    SQL Server双机热备之发布、订阅实现实时同步
  • 原文地址:https://www.cnblogs.com/wnwn/p/12330880.html
Copyright © 2011-2022 走看看