mysql使用取摸方式分表

MySQL如何优化

表的设计合理化(符合3NF)

添加适当索引(index) [四种: 普通索引、主键索引、唯一索引unique、全文索引]

SQL语句优化

分表技术(水平分割、垂直分割)

读写[写: update/delete/add]分离

存储过程 [模块化编程,可以提高速度]

对mysql配置优化 [配置最大并发数my.ini, 调整缓存大小 ]

mysql服务器硬件升级

定时的去清除不需要的数据,定时进行碎片整理(MyISAM)

水平拆分

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

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

水平分割案例

思路:在大型电商系统中,每天的会员人数不断的增加。达到一定瓶颈后如何优化查询。

可能大家会想到索引,万一用户量达到上亿级别,如何进行优化呢?

使用水平分割拆分数据库表。

如何使用水平拆分数据库

使用水平分割拆分表,具体根据业务需求,有的按照注册时间、取摸、账号规则、年份等。

代码实战

项目结构图

package cn.zhiwei.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;

/**
 * 首先在数据库新建一个表存放自增id
 * CREATE TABLE UUID(id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT)ENGINE=MYISAM CHARSET utf8;
 * Created by 刘志威 on 2018/4/26.
 */
@Service
public class UserService {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    //进行分表,按数据库的主键id来分
    public boolean markTable(String name){
        // 1.先获取到 自定增长ID
        String idInsertSQL = "INSERT INTO uuid VALUES (NULL);";
        jdbcTemplate.update(idInsertSQL);
        //得到了三个表共用一个自增id
        Long insertId = jdbcTemplate.queryForObject("select last_insert_id()", Long.class);
        //利用取模算法得到表名 表为user0 user1 user2
        String table ="user" +insertId % 3;
        //拼成添加的sql
        String sql="insert into "+table+" values (‘"+insertId+"‘,‘"+name+"‘);";
        System.out.println("SQL:" + sql);
        //执行添加方法
        int update = jdbcTemplate.update(sql);

        return update>0?true:false;
    }
    //分表查询
    public String getUserName(Long id) {
        //得到表名
        String tableName = "user" + id % 3;
        //拼接查询语句
        String sql = "select name from " + tableName + "  where id="+id;
        System.out.println("SQL:" + sql);
        String name = jdbcTemplate.queryForObject(sql, String.class);
        return name;
    }
}

  

package cn.zhiwei.controller;

import cn.zhiwei.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Created by 刘志威 on 2018/4/26.
 */
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    @RequestMapping("/insertUser")
    public Object insertUser(String name){
        return userService.markTable(name);
    }

    @RequestMapping("/selectName")
    public Object selectName(Long id){
        return userService.getUserName(id);
    }
}

  

package cn.zhiwei;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 启动类
 * Created by 刘志威 on 2018/4/26.
 */
@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class,args);
    }
}

 

页面效果

 

原文地址:https://www.cnblogs.com/liuzhiw/p/8955420.html

时间: 2024-08-01 08:24:24

mysql使用取摸方式分表的相关文章

MYSQL性能优化分享(分库分表)

MYSQL性能优化之分库分表与不停机修改mysql表结构,需要的朋友可以参考下 1.分库分表 很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表company,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从company0到company99,然后根据id分发记录到这些表中,牛逼的代码大概是这样子: 复制代码代码如下: <?php for($i=0;$i

Mysql数据库常用分库和分表方式

1 分库 1.1 按照功能分库 按照功能进行分库.常见的分成6大库: 1 用户类库:用于保存了用户的相关信息.例如:db_user,db_system,db_company等. 2 业务类库:用于保存主要业务的信息.比如主要业务是笑话,用这个库保存笑话业务.例如:db_joke,db_temp_joke等. 3 内存类库:主要用Mysql的内存引擎.前台的数据从内存库中查找,速度快.例如:heap. 4 图片类库:主要保存图片的索引以及关联.例如:db_img_index,db_img_res.

mysql大数据分库和分表 php解决方案!

当Mysql数据量过大时,就会面临压力分解,这时分库分表是一个不错的解决方案,现在我们就来谈谈Mysql如何分库分表比较理想,然后再用php如何调用. 1,主从复制,读写分离 对主库修改数据,查询使用从库.一主多从,来降低数据库读取压力. 2,分库分表 根据实体业务来分库,分表.如,根据数据的活跃性,根据用户uid等. 3,MySQL 不同存储引擎区别 InnoDB 用于数据完整性/写性能要求比较高的应用. MyISAM 适合查询应用. 分表是分散数据库压力的好方法. 分表,最直白的意思,就是将

Mysql第八天 分区与分表

分区表 主要提供例如以下的特性,或者适合如此场景: 数据量非常大, 或者仅仅有表中最后的部分有热点数据.其它均为历史数据 分区表数据更easy维护,能够对独立的分区删除等操作 分区表的数据能够分布在不同的物理设备上.从而高效地利用多个硬件设备. 能够避免一些特殊瓶颈.比方InnoDB的单个索引的相互排斥訪问 能够备份和恢复独立的分区 创建分区表 通常有这么几种分法.由于主键或者是唯一约束键必须有一部分包括在分区键中,所以一般要不无主键,要不就依照自增主键的id进行范围分区,要不就把分区字段和主键

MySQL:互联网公司常用分库分表方案汇总

一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用.接下来就可以想象了吧(并发量.吞吐量.崩溃). 1.IO瓶颈 第一种:磁盘读IO瓶颈,热点数据太多,数据库缓存放不下,每次查询时会产生大量的IO,降低查询速度 -> 分库和垂直分表. 第二种:网络IO瓶颈,请求的数据太多,网络带宽不够 -> 分库. 2.CPU瓶颈 第一种:SQL问题,如SQL中包含joi

Mysql性能优化三(分表、增量备份、还原)

对表进行水平划分 如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻辑上可以划分.一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势.比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了.如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了.所以一个好的拆分依据是 最重要的.UNION 例: 订单表根据订单产生时间

mysql实现插入数据到分表

use mysql;/*创建原始数据表*/DROP TABLE IF EXISTS `articleinfo`;CREATE TABLE `articleinfo`(`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,`title` VARCHAR(20) DEFAULT NULL,`content` VARCHAR(20) DEFAULT NULL,`comment_time` VARCHAR(20) DEFAULT NULL) E

Mysql数据库分库备份,分表备份

分库备份 #!/bin/sh DBPATH=/server/backup MYUSER=root MYPASS=oldboy123 SOCKET=/data/3306/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASS -S $SOCKET" MYDUMP="mysqldump -u$MYUSER -p$MYPASS -S $SOCKET" [ ! -d $DBPATH ] && mkdir $DBPATH for

【转】MySQL使用为什么要分库分表

1 基本思想之什么是分库分表? 从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上. 2 基本思想之为什么要分库分表? 数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大:另外,由于无法进行分布式式部署,而一台服务器的资源(CPU.磁盘.内存.IO等)是有限的,最终数据库所能承载的数据量.数据处理能力都将遭遇瓶颈. 3