iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >怎么在MySQL中实现分表与分区
  • 522
分享到

怎么在MySQL中实现分表与分区

2023-06-14 19:06:25 522人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关怎么在MySQL中实现分表与分区,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。分表单表数据量太大时,会严重影响sql执行的性能。一般单表到达几百万的时候,性能就会

这篇文章将为大家详细讲解有关怎么在MySQL中实现分表与分区,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

分表

单表数据量太大时,会严重影响sql执行的性能。一般单表到达几百万的时候,性能就会相对差一些了,这时就得分表了。

分表就是把一个表的数据放到多个表中,然后查询的时候就查一个表。比如按照项目id来分表:将固定数量的项目数据放在一个表中,这样就可以控制每个表的数据量在可控的范围内。

分库

根据经验来讲,一个库最多支持到并发2000时就需要扩容了,而且一个健康的单库并发值最好保持在1000左右。那么你可以将一个库的数据拆分到多个库中,访问的时候就访问一个库好了。

这就是所谓的分库分表,为啥要分库分表?

  • 高并发支撑能力

  • 降低磁盘使用率

  • 提高SQL执行性能

如何分库分表

直接看图:

怎么在MySQL中实现分表与分区

对于垂直拆分,建议最好在系统设计之初做好表设计,避免垂直分表。

水平拆分可以按照range来分,或是按照某个字段hash。按照range来分,好处在于扩容简单,准备好新的表或库就可以了。但是容易产生热点问题,实际使用时要结合业务场景来看。按照hash来分,好处在于可以平均分配每个库或表的请求压力,缺点是扩容麻烦,之前的数据要rehash,存在一个数据迁移的过程。

分库分表带来的问题

分库分表能有效地缓解单机和单库带来的网络io、硬件资源、连接数的压力。但也带来了一些问题。

  • 事务一致性问题
    通过分布式事务或者保证最终一致性来解决。

  • 跨节点关联查询join问题
    全局表、字段冗余、数据组装、ER分片

  • 跨节点分页、排序、聚集函数问题
    首先在不同分片节点进行查询,最后要对结果进行汇总或归并

  • 全局主键避重问题
    各种分布式ID生成算法

  • 数据迁移、扩容问题
    如果是range分片,只需要添加节点就可以进行扩容了。
    如果是hash,一般做法是先读出历史数据,然后按指定的分片规则再将数据写入到各个分片节点中。

数据迁移

数据迁移介绍两种方案。

一个最low的方案,就是系统停机一段时间,用实现写好的导数据的工具跑一遍把单独单表的数据独出来,写到分库分表里面去。

第二个方案听起来就比较靠谱了,双写迁移方案。在线上系统里,之前所有写数据的地方,增删改操作,除了对旧库增删改,再加上对新库的增删改,这就是所谓的双写。然后系统部署之后,把方案一里的导数据工具跑起来,读老库写新库。写的时候要根据gmt_modified这类字段判断这条数据最后修改的时间,除非是读出来新库没有,或是比新库数据新才会写。简单来说就是不允许用老数据覆盖新数据。

写完一轮之后,有可能还是存在不一致,那么就程序自动新一轮校验,对比新老库每个表的每条数据,接着如果有不一样的,就针对那些不一样的,从老库读数据再次写。反复循环直到数据完全一致。

中间件

分库分表的中间件比较常见的有:

  • Cobar:阿里b2b团队开发开源的,属于proxy层方案,介于应用服务器数据库服务器之间。应用程序通过JDBC驱动访问Cobar集群,Cobar根据SQL和分库规则对SQL做分解,然后分发到Mysql集群不同的数据库实例上执行。不支持读写分离、存储过程、跨库join和分页等操作。最近几年都没更新了,也没啥人用了。

  • TDDL:淘宝团队开发的,属于client层方案。支持基本的crud语法和读写分离,但不支持join、多表查询等语法。目前只用也不多,因为还依赖淘宝的diamond配置管理系统。

  • Atlas:360开源的,属于proxy层方案。也是好几年没维护,现在用的公司基本也很少了。

  • Sharding-jdbc:当当开源的,属于client层方案,目前已更名为ShardingSphere。SQL语法支持的也比较多,没有太多限制,支持分库分表、读写分离、分布式id生成、柔性事务(最大努力送达型事务、TCC事务)。而且使用的公司比较多,社区活跃。

  • Mycat:基于Cobar改造,属于proxy层方案。支持的功能非常完善。相比Sharding-jdbc来说,年轻一些。

综上,现在可以考虑使用的就是Sharding-jdbc和Mycat。

Sharding-jdbc这种client层方案的有点在于不用部署,运维成本低,不需要代理层的二次转发,性能高。缺点是有耦合性。
Mycat这种proxy层方案的缺点在于需要部署,自己运维一套中间件,运维成本高,但是好处在于对项目是透明的。

mysql分区(不建议使用)

这里介绍分区主要是防止和切分、分库分表等概念混淆。
MySQL从5.1版本开始支持分区(partition)的功能。分区指根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库的应用而言,逻辑上只有一个表或一个索引,但是实际上这个表可能由多个物理分区组成,即对应用是透明的。
MySQL分区引入了分区键的概念,采取分治法,有利于管理非常大的表。分区键用于根据某个区间值、特定值列表或HASH函数执行数据的聚集,让数据根据规则分布在不同的分区中。MySQL 5.7中可用的分区类型主要有以下6种:

  • RANGE分区:基于一个给定连续区间范围,把数据分配到不同的分区。

  • LIST分区:类似RANGE分区,区别在LIST分区是基于枚举出的值列表分区,RANGE是基于给定的连续区间范围分区。

  • COLUMNS分区:类似于RANGE和LIST,区别在于分区键既可以是多列,又可以是非整数。

  • HASH分区:基于给定的分区个数,把数据取模分配到不同的分区。

  • KEY分区:类似于HASH分区,但使用MySQL提供的哈希函数。

  • 子分区:也叫做复合分区或者组合分区,即在主分区下再做一层分区,将数据再次分割。

这里举一LIST分区的例子:

CREATE TABLE orders_list (  id INT AUTO_INCREMENT,  customer_surname VARCHAR(30),  store_id INT,  salesperson_id INT,  order_date DATE,  note VARCHAR(500),  INDEX idx (id)) ENGINE = INNODB  PARTITION BY LIST(store_id) (  PARTITION p1  VALUES IN (1, 3, 4, 17)  INDEX DIRECTORY = '/var/orders/district1'  DATA DIRECTORY = '/var/orders/district1',  PARTITION p2  VALUES IN (2, 12, 14)  INDEX DIRECTORY = '/var/orders/district2'  DATA DIRECTORY = '/var/orders/district2',  PARTITION p3  VALUES IN (6, 8, 20)  INDEX DIRECTORY = '/var/orders/district3'  DATA DIRECTORY = '/var/orders/district3',  PARTITION p4  VALUES IN (5, 7, 9, 11, 16)  INDEX DIRECTORY = '/var/orders/district4'  DATA DIRECTORY = '/var/orders/district4',  PARTITION p5  VALUES IN (10, 13, 15, 18)  INDEX DIRECTORY = '/var/orders/district5'  DATA DIRECTORY = '/var/orders/district5');

分区的优点:

  • 扩大存储容量。

  • 优化查询。在WHERE子句中包含分区条件时可以只扫描必要的分区来提高查询效率;同事在涉及SUM()和COUNT()这类聚合函数的查询时,可以在每个分区上并行处理。

  • 对于已经过期或不需要保存的数据分区,可以通过删除分区来快速删除数据。

  • 跨多磁盘来分散查询数据,获得更大的查询吞吐量。

关于怎么在MySQL中实现分表与分区就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: 怎么在MySQL中实现分表与分区

本文链接: https://www.lsjlt.com/news/274337.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么在MySQL中实现分表与分区
    这篇文章将为大家详细讲解有关怎么在MySQL中实现分表与分区,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。分表单表数据量太大时,会严重影响sql执行的性能。一般单表到达几百万的时候,性能就会...
    99+
    2023-06-14
  • MySQL中怎么实现分区表
    MySQL中怎么实现分区表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。   MySQL分区的建立 MySQL可以建立四种分区...
    99+
    2024-04-02
  • 如何在MySQL中实现分表和分区
    如何在MySQL中实现分表和分区?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。垂直分表垂直分表就是一个包含有很多列的表拆分成多...
    99+
    2024-04-02
  • MySQL中怎么实现表分区功能
    今天就跟大家聊聊有关MySQL中怎么实现表分区功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 MySQL表分区功能基础  创建分区表  CREA...
    99+
    2024-04-02
  • PL/SQL中的分区表与分区索引怎么实现
    在 PL/SQL 中实现分区表和分区索引,可以通过以下步骤: 创建分区表:在创建表的时候,使用 PARTITION BY 子句指定...
    99+
    2024-05-08
    PL/SQL
  • Mysql中怎么实现水平分表与垂直分表
    本篇文章为大家展示了Mysql中怎么实现水平分表与垂直分表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。水平分表:如上图所示:另外三张表表结构是一样的  ...
    99+
    2024-04-02
  • mysql中分表与分区的区别是什么
    这篇文章将为大家详细讲解有关mysql中分表与分区的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一,什么是mysql分表,分区什么是分表,从表面...
    99+
    2024-04-02
  • MySQL中怎么实现分库分表
    今天就跟大家聊聊有关MySQL中怎么实现分库分表,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Mysql分库分表方案1.为什么要分表:当一张表的数据...
    99+
    2024-04-02
  • MySQL中怎么实现分区
    本篇文章为大家展示了MySQL中怎么实现分区,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 一.InnoDB逻辑存储结构首先要先介绍一下InnoDB逻辑存...
    99+
    2024-04-02
  • mysql中怎么实现range分区
    本篇文章为大家展示了mysql中怎么实现range分区,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一,如何启动mysqld?    ...
    99+
    2024-04-02
  • 怎么在MySQL数据库中实现分表分库操作
    这篇文章将为大家详细讲解有关怎么在MySQL数据库中实现分表分库操作,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。分表分库垂直拆分垂直拆分就是要把表按模块划...
    99+
    2024-04-02
  • mysql中怎么创建表分区
    今天就跟大家聊聊有关mysql中怎么创建表分区,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 1.RANGE 分区: CREATE TABLE ...
    99+
    2024-04-02
  • MySQL中怎么实现水平分区
    MySQL中怎么实现水平分区,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。表结构如下:查询。 SELECT ...
    99+
    2024-04-02
  • MySQL实现清空分区表单个分区数据
    目录mysql清空分区表单个分区数据1.单个分区清空2.编辑存储过程MySQL自动分区自动清理完整的SQL查看分区总结MySQL清空分区表单个分区数据 1.单个分区清空 ALTER TABLE xxx TRUN...
    99+
    2023-03-13
    MySQL清空分区表 MySQL分区数据 MySQL分区表
  • MySQL中怎么实现分表处理
    本篇文章给大家分享的是有关MySQL中怎么实现分表处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  MySQL分表处理怎么实现  比如ta...
    99+
    2024-04-02
  • mysql中怎么实现水平分表和垂直分表
    本篇文章为大家展示了mysql中怎么实现水平分表和垂直分表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 什么是数据库分区? 数据库分区是一种物理数据库设计技术...
    99+
    2024-04-02
  • MySQL 5.5中怎么实现分区功能
    今天就跟大家聊聊有关MySQL 5.5中怎么实现分区功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。  非整数列分区  任何使用过分区的人应该都遇...
    99+
    2024-04-02
  • MySQL分库分表与分区的入门指南
    前言 关系型数据库比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限,当数据量和并发量起来之后,就必须对数据库进行切分了。 数据切分(sharding)的手段就是分库分表。...
    99+
    2024-04-02
  • PostgreSQL中怎么利用表继承实现分区表
    这篇文章将为大家详细讲解有关PostgreSQL中怎么利用表继承实现分区表,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述分区指的是将逻辑上一的一个大表分...
    99+
    2024-04-02
  • 怎么在springboot中使用shardingjdbc实现分库分表
    这篇文章给大家介绍怎么在springboot中使用shardingjdbc实现分库分表,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概览1.1 简介ShardingSphere-JDBC定位为轻量级 Java 框架...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作