MySQL分库分表总结讲解

yizhihongxing

MySQL分库分表总结讲解

什么是MySQL分库分表

MySQL分库分表是指将一个大的数据库按照一定规则分割为多个子数据库,每个子数据库分布于不同的物理服务器上,同样地,将一张大表根据一定条件分割为多张小表。

分库分表的主要目的是解决单个库或单表数据量过大导致查询性能缓慢、写入性能降低,以及瓶颈问题等。

MySQL分库分表的策略

MySQL分库分表的策略主要有以下几种:

  • 垂直分表:将一张表按照列进行分表,将不常用的列分离出去形成一张新表,保证常用的列在同一张表,以提高查询效率。

  • 水平分表:将一张表按照行进行分表,将表中的数据均分到多张表中,并使用相同的表结构,以提高写入和查询效率。

  • 分库:将一个库中的多个表按照业务分散到多个库中,以提高并发和查询效率。

  • 分区:将一个表按照时间、ID等分段方式进行分割成多个小表,以提高查询效率。

MySQL分库分表示例

垂直分表示例

我们现在有一个名为users的表,其结构如下:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL DEFAULT '',
  `password` varchar(50) NOT NULL DEFAULT '',
  `email` varchar(255) DEFAULT NULL,
  `gender` tinyint(1) DEFAULT NULL,
  `age` int(3) NOT NULL DEFAULT '18',
  `status` tinyint(1) NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

我们可以将其进行垂直分表。将emailgender两个字段分离出去,形成一张新表user_info

CREATE TABLE `user_info` (
  `id` int(11) NOT NULL,
  `email` varchar(255) DEFAULT NULL,
  `gender` tinyint(1) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

同时,将users表中的这两个字段移除:

ALTER TABLE `users` 
DROP COLUMN `email`,
DROP COLUMN `gender`;

在实际使用中,一般不会仅按照这种方式进行分表,而是根据实际业务需要进行决策。

水平分表示例

我们现在有一个名为orders的表,其结构如下:

CREATE TABLE `orders` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `user_id` BIGINT(20) NOT NULL DEFAULT 0,
  `order_name` VARCHAR(50) NOT NULL DEFAULT '',
  `order_price` DECIMAL(10,2) NOT NULL DEFAULT 0.00,
  PRIMARY KEY (`id`),
  KEY `idx_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

我们可以将其进行水平分表。将orders表根据user_id字段进行分表,将相同user_id的数据放在同一个表中。

例如:
我们可以将所有的user_idmod 10的方式进行分类,将user_id除以10之后得到的余数,作为后缀,例如:
orders_0表:存储user_id为0、10、20的订单数据;
orders_1表:存储user_id为1、11、21的订单数据;
……

分库示例

假如我们有一个电商网站,涉及到goodsuserorder三个表,同时访问量较大,我们可以将其进行分库,将三个表分别分散到不同的库中。

例如:
我们可以将goods表单独放在一台物理服务器上的一个库中,将user表和order表放在另外一台物理服务器上的另一个库中,以减少单个库的访问压力。

总结

MySQL分库分表是一种提高数据查询效率和写入效率的方案,在处理大数据量或高并发的业务场景下不可避免。基于不同的业务需求和数据访问情况,选择适合的分库分表策略非常重要。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySQL分库分表总结讲解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySQL判断时间段是否重合的两种方法

    下面是 MySQL 判断时间段是否重合的两种方法的完整攻略。 方法一:使用比较运算符判断 在数据库中创建一个表格来存储时间段数据,如下所示: CREATE TABLE `mytable` ( `id` int(11) NOT NULL, `start_time` datetime NOT NULL, `end_time` datetime NOT NULL,…

    database 2023年5月22日
    00
  • MySql自动分区

    自动分区需要开启MySql中的事件调度器,可以通过如下命令查看是否开启了调度器 show variables like ‘%scheduler%’; 如果没开启的话通过如下指令开启 SET GLOBAL event_scheduler = 1;   1、创建一个分区表 CREATE TABLE sales ( id INT AUTO_INCREMENT, a…

    MySQL 2023年4月13日
    00
  • 如何使用Python实现数据库中数据的批量更新?

    以下是使用Python实现数据库中数据的批量更新的完整攻略。 数据库中数据的批量更新简介 在数据库中,批量更新是一次性更新多条记录。在Python中,可以使用pymysql连接MySQL数据库,并UPDATE语句实现批量更新。 步骤1:连接到数据库 在Python中,可以使用pymysql连接MySQL数据库以下是连接到MySQL的基本语法: import …

    python 2023年5月12日
    00
  • 在MS SQL Server中检查约束条件

    当在MS SQL Server中创建表时,我们可以定义一个或多个检查约束来限制表格中列的取值。检查约束是SQL Server中可用的一种约束,它用于检查指定列是否符合特定的约束条件,这些约束条件可以是一个具体的值、一个范围、一个特定的函数等。以下是在MS SQL Server中检查约束的完整攻略: 创建检查约束 要创建一个检查约束,可以使用CREATE TA…

    database 2023年3月27日
    00
  • 在Centos 5.6下安装 redis

    先引用redis官方(http://redis.io/) 的介绍: Redis is an open source, advanced key-value store.It is often referred to as a data structure server since keys can contain strings, hashes, lists…

    Redis 2023年4月11日
    00
  • 如何保障mysql和redis之间的数据一致性

    在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问Mysql等数据库。这样可以大大缓解数据库的压力。Redis缓存数据的加载可以分为懒加载和主动加载两种模式,下面分别介绍在这两种模式下的数据一致性如何处理。 懒加载 读取缓存步骤一般没有什么问题,但是一旦涉及到…

    Redis 2023年4月11日
    00
  • pymysql 插入数据 转义处理方式

    当使用pymysql向MySQL数据库中插入数据时,需要注意字符串中可能含有引号、单引号、反斜杠等特殊字符,这些字符可能导致SQL语句语法出现错误。为了避免这种情况,需要使用转义处理方式,将特殊字符转换为可以被SQL语句安全接收的形式。 以下是pymysql插入数据的转义处理方式: 使用pymysql.escape_string()函数 pymysql.es…

    database 2023年5月22日
    00
  • Redis-Scan命令

                                                                                Scan命令 Scan命令:从海量的 key 中找出满足特定前缀的 key 列表 查询key为某一类型的数据可能有很多方法,例如可以通过keys*或者是keys codehole*,查询key前缀为codeh…

    Redis 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部