为什么会决定进行分库分表,分库分表过程中遇到什么难题,如何解决的?

一、为什么决定进行分库分表?

  1. 根据业务类型,和业务容量的评估,来选择和判断是否使用分库分表
  2. 当前数据库本事具有的能力,压力的评估
  3. 数据库的物理隔离,例如减少锁的争用、资源的消耗和隔离等
  4. 热点表较多,并且数据量大,可能会导致锁争抢,性能下降
  5. 数据库的高并发,数据库的读写压力过大,可能会导致数据库或系统宕机
  6. 数据库(MySQL5.7以下)连接数过高,会增加系统压力
  7. 单表数据量大,如SQL使用不当,会导致io随机读写比例高。查询慢(大表上的B+树太大,扫描太慢,甚至可能需要4层B+树)
  8. 备份和恢复时间比较长

二、都遇到什么问题?

  1. 全局pk(主键和唯一索引)的冲突检测不准确,全局的自增主键支持不够好
  2. 分片键的选择。如没有选择好,可能会影响SQL执行效率
  3. 分布式事务,中间价产品对分布式事务的支持力度
  4. 对于开发来说,需要进行业务的拆分
  5. 对于开发来说,部分SQL不兼容则需要代码重构,工作量的评估
  6. 对于开发来说,跨库join,跨库查询

三、如何解决?

  1. 使用全局分号器。或者使用全局唯一id,(应用生成顺序唯一int类型做为全局主键)
  2. 应用层来判断唯一索引
  3. 配合应用选择合适的分片键,并加上索引
  4. 配合应用,配合开发,对不兼容SQL的进行整改

原文地址:https://www.cnblogs.com/os-linux/p/11929011.html

时间: 2024-11-14 12:47:19

为什么会决定进行分库分表,分库分表过程中遇到什么难题,如何解决的?的相关文章

oracle表连接——处理连接过程中另外一张表没有相关数据不显示问题

一个数据表基本上很难满足我们的查询要求,同时,将所有的数据都保存在一个表格中显然也不是一种好的数据库设计,为了避免数据的冗余,删除.更新异常,我们通常需要建立一张外键表,通过表连接,来获取我们自己想要得到的数据,所以在数据查找中,表连接是一个经常使用到的操作,下面我们来看看两个或者几个表有哪些方式是可以连接的. 经常遇到的问题:我们或许在表连接的过程中用于连接的另外一张表数据为空,导致某些数据得不到.我们要怎么解决呢????? 我们就先从介绍表连接的方式开始,在介绍的过程中,就会得到解决. 假如

Mysql分表分库分析

对于大型的互联网应用,数据库单表的数据量可能达到千万甚至上亿级别,同时面临这高并发的压力.Master-Slave结构只能对数据库的读能力进行扩展,写操作还是集中在Master中,Master并不能无限制的挂接Slave库,如果需要对数据库的吞吐能力进行进一步的扩展,可以考虑采用分库分表的策略. 1.分表 在分表之前,首先要选中合适的分表策略(以哪个字典为分表字段,需要将数据分为多少张表),使数据能够均衡的分布在多张表中,并且不影响正常的查询.在企业级应用中,往往使用org_id(组织主键)做为

架构之数据库分表分库

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

分表分库方法总结

案例一: 1,背景:一个地址薄的应用程序,设计的用户量为2亿,统计出每个用户的地址薄为30个左右,整个数据量为60亿,使用mysql数据库 计划分为:1000个表,100个库 2,分库分表代码 ? 1 2 3 4 5 6 7 8 private function getDbNo($email)  {      $m = md5($email);      $n = hexdec(substr($m, 0, 16));      $tableNo = fmod($n, 1000);      $d

总结下Mysql分表分库的策略及应用

上月前面试某公司,对于mysql分表的思路,当时简要的说了下hash算法分表,以及discuz分表的思路,但是对于新增数据自增id存放的设计思想回答的不是很好(笔试+面试整个过程算是OK过了,因与个人预期的薪酬不太理想而忍痛放弃.),在此再深究下mysql 分表优化之类的设计思路方案.先来闲扯下发文目的: 为什么要分表和分区? 日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表.这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情

关于论坛数据库的设计(分表分库等-转)

关于论坛数据库的设计 文章分类:数据库 一个简单的论坛系统 1:包含下列信息: 2:每天论坛访问量300万左右,更新帖子10万左右. 请给出数据库表结构设计,并结合范式简要说明设计思路. 一. 发帖主题和回复信息存放在一张表,并在这个表中增加user_name字段 对数据库的操作而言,检索数据的性能基本不会对数据造成很大的影响(精确查找的情况下),而对表与表之间的连接却会产生巨大的影响, 特别在有巨量数据的表之间:因此对问题的定位基本可以确定:在显示和检索数据时,尽量减少数据库的连接以及表与表之

mysql分表分库 ,读写分离

1.分表 当项目上线后,数据将会几何级的增长,当数据很多的时候,读取性能将会下降,更新表数据的时候也需要更新索引,所以我们需要分表,当数据量再大的时候就需要分库了. a.水平拆分:数据分成多个表 b.垂直拆分:字段分成多个表 c.插入/更新/删除数据和查询统计 MyISAM存储引擎有一个MERGE存储引擎,可以将多个表合成一个表,就可以进行这四种操作   InnoDB用alter able可以将变成MyISAM存储引擎,然后使用MERGE引擎 面试题:MERGE存储引擎将N个子表合并,那么在数据

Mycat分表分库 

一.Mycat介绍 Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里. 二.Mycat基础环境搭建 首先需要下载Mycat必需的一些环境:

Mycat分表分库  

一.Mycat介绍 Mycat 是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里. 二.Mycat基础环境搭建 首先需要下载Mycat必需的一些环境: