zoukankan      html  css  js  c++  java
  • mysql大表查询慢对应方案

    背景:由于业务量的递增以及客户并发请求的递增,某些数据的返回需经大表(3000W以上)查询返回,返回数据时间由能接受到了完全不能接受的地步,需要对数据库进行相应优化

    目前架构:A-B-C   相当于单主下边挂着单从库

    方案一:

    基于成本足够的情况下,数据库切分,可以考虑PXC(三节点最优)+mycat架构

    优点:

    缺点:

    方案二:

    成本不够的话,在原有的基础上进行表的分区,eg:业务基于时间段返回数据,可以通过range分区基于复合主键对时间段进行表的分区

    优点:将一个大表分为多个小文件进行存储,存储位置可以指定放置于不同的磁盘上,分担磁盘IO压力

    缺点:锁的粒度比较大

    表分区类型:

    1>range表分区:适用于查询条件中以时间为区分度的需求。比如:2019~2021年的表单数据,以时间字段作为主键复合索引分区为四个区   2019以前的,2019~2020年,2020~2021年,2021年以后的

    2>list表分区:适用于查询条件包含某些确定列表中的数据。   eg:  300个公司报表数据,分为10个表存储,以公司ID做为主键复合索引

    3>hash表分区:可以对某个字段hash取模后,将数据均匀分配

    4>key表分区:根据mysql内部提供函数进行分区

    基于时间字段以range方式对A表进行表分区:

    CREATE TABLE `A_test` (

    `id` bigint(20) NOT NULL AUTO_INCREMENT,

    `user_id` int(11) DEFAULT NULL,

    `role` varchar(20) DEFAULT NULL COMMENT '岗位编号',

    `createtime` datetime DEFAULT NULL COMMENT '创建时间',

    PRIMARY KEY (`id`,`createtime`),

     KEY `index1` (`createtime`)

    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='A统计表'

    PARTITION by  range (YEAR(createtime))(

    PARTITION p2018 VALUES less than (2019),

    PARTITION p2019 VALUES less than (2020),

    PARTITION p2020 VALUES less than (2021),

    PARTITION p2021 VALUES less than (2022),

    );

    方案三:

    基于现有业务可以接受的情况,引入数仓(hadoop大数据)离线计算,通过接口调用进行一个离线数据的返回

    1、kylin  需要预先建模

    2、presto 分布式,基于离线计算亚秒级返回

    待完善

    PRIMARY KEY (`id`,`createtime`),

  • 相关阅读:
    一些特效,不断更新
    关于cin输入字符串
    开辟二维数组
    c++ 有关webBrowser控件的一些整理
    WebBrowser 常用方法
    WebRequest和WebBrowser同时登陆,使用同一个sessionID
    delphi 编写的com 对象 用php调用的实例
    Two math problems in http://projecteureka.org sumitted by me.
    delphi dll 实例 与 dll窗体实例
    SSH酒店点菜系统笔记
  • 原文地址:https://www.cnblogs.com/byfboke/p/14485811.html
Copyright © 2011-2022 走看看