Mysql海量数据处理

Mysql海量数据处理一说海量数据有人就说了直接用大数据,那只能说不太了解这块,为此我们才要好好的去讲解一下海量的处理海量数据的处理分为两种情况1)表中有海量数据,但是每天不是很快的增长2)表中有还流量数据,而且每天很快速的增长针对这了两种情况,我们给出的解决方案也不太一样,而且也不是所有的项目都是这样的情况。海量数据的解决方案1)使用缓存2)页面静态化技术3)数据库优化4)分离数据库中活跃的…

大家好,又见面了,我是你们的朋友全栈君。

一说海量数据有人就说了直接用大数据,那只能说不太了解这块,为此我们才要好好的去讲解一下海量的处理

  1. 海量数据的处理分为两种情况
    1)表中有海量数据,但是每天不是很快的增长
    2)表中有还流量数据,而且每天很快速的增长
    针对这了两种情况,我们给出的解决方案也不太一样,而且也不是所有的项目都是这样的情况。

  2. 海量数据的解决方案
    1)使用缓存
    2)页面静态化技术
    3)数据库优化
    4)分离数据库中活跃的数据
    5)批量读取和延迟修改
    6)读写分离
    7)使用NoSql和Hadoop等技术
    8)分布式部署数据库
    9)应用服务和数据库分离
    10)使用搜索引擎搜索数据库中的数据
    11)进行业务的拆分

    千万级数数据,mysql实际上确实不是什么压力,InnoDB的存贮引擎,使用B+数存储结构,千万级的数据量,基本也就是三四层的搜索,如果是配置合适的索引,性能基本也不是问题

    但有时候业务上面的增长,导致数据还会继续增长,为了应对这方面的问题而必须要做扩展了此时可能首先考虑的就是分库分表

    数据的切分: 就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散的存放到多个数据库中,以达到分散单台数据库负载的效果,即为分库分表

  3. 分表
    把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它

    1)什么时候考虑分表?
    * 一张表的查询速度已经慢的受到影响的时候
    * sql经过优化
    * 单张表中数据量爱的
    * 当频繁插入或者联合查询时,查询变慢
    2)分表解决的问题
    * 单表的并发能力提高了,硬盘I/O性能也提高了,写操作效率提高了
    * 查询一次的时间短了
    * 读写缩影的数据变小
    * 插入数据需要重新建立索引的数据减少

  4. 分库
    将一个应用中对应的一个数据库分解成多个数据库,且可以这多个数据库可以存在同一个服务器上,也可以存在于多个服务器上

    1)什么时候考虑分库?
    * 单台DB的存贮空间不够
    * 随着查询量的增加单台数据库服务器已经没法支撑

    2)分库解决的问题
    * 主要目的是为了突破单节点数据库的I/O能力限制,解决数据库扩展性问题

  5. 分区
    把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的

    1)什么时候考虑分区
    * 张表的查询速度已经慢的受到影响的时候
    * sql优化
    * 数据量大
    * 表中的数据是分段的
    * 对数据的操作往往只涉及一部分数据,而不是所有的数据

    2)分区可以解决的问题
    提升查询效率

    3)分区的实现方式
    使用数据库工具,或者sql语句

PARTITION BY RANGE(YEAR(order_day)) (
    PARTITION p_2010 VALUES LESS THAN (2010),
    PARTITION p_2011 VALUES LESS THAN (2011),
    PARTITION p_2012 VALUES LESS THAN (2012),
PARTITION p_catchall VALUES LESS THAN MAXVALUE);

MAXVALUE 表示最大的可能的整数值。

查看某一分区内的数据:
SELECT * FROM sales PARTITION (p_2010);/*查询在该分区内的数据*/

删除分区
ALTER TABLE sale_data DROP PARTITION s20100406 ;

4)分区类型
* RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
* LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
* HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
* KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值

6. 分区和分表的区别于联系
* 分区和分表的目的都是减少数据库的负担,提高表的增删改查的效率。
* 分区只是一张表中的数据的存储位置发生变化,分表是将一张表分城多个表
* 访问量大,且数据比较大时,两种方式可以互相配合使用
* 访问量不大,但表数据比较多时,可以只进行分区

7. 垂直分割和横向分割
将表中的一个字段存放在另一个表(或数据库中) 将表中的一些数据存放到另一个表中或数据库中其中两个表的字段一致
在这里插入图片描述在这里插入图片描述

  1. 拆分之后面临的问题**
    1)事物的支持
    ,分库分表,就变成了分布式事务
    2)join时跨库,跨表的问题
    3)分库分表,使用分布式读写分离,分布式为了保证为强一致性,必然带来延迟,导致性能降低,系统的复杂程度高

解决方案
1)分布式事物的解决方法为JTA,而JTA的实现又需要依靠Atomikos框架,而Atomikos又需要SringData+jpa支持,而SptingData+jpa又可以需要Hibernate实现持久化操作
2)选用第三方的数据中间件(Atlas,Mycat,TDDL)同时业务系统需要配合数据存储的升级

9. 总结
能不分就不分,分库分表的行为都会在某种程度上提升业务逻辑的复杂度,业务的时间复杂程度往往会翻倍或指数上升,所以,在分库之前,不要为分而分,去做其他做其它力所能及得事情把,比如升级硬件,网络,数据库版本,读写分离,负载均衡等,所有分库分表的前提是,这些你已经尽力了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/152425.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号