mysql数据库分表分库的策略

MySQL数据库的分表分库策略主要是为了应对海量数据的存储和管理,不仅可以提高数据库的查询效率,还可以降低单个数据库的存储压力。

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

分库分表规则

水平分库

水平分库是将一个数据库中的数据,在不同的服务器上分别存储。可以根据业务需要将相同的表拆分到不同的服务器上。例如,一个电商业务可能有用户数据库、订单数据库和日志数据库等。将这三个库放在不同的服务器上,可以有效的提高系统的性能。同时水平分库还可以提高系统的可用性,当某一个服务器宕机时,系统仍然可以继续向正常的服务器发送请求。

水平分库的示例:

--创建users库
CREATE SCHEMA users;

--在users库中创建user表
CREATE TABLE users.user(
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(20),
  PRIMARY KEY (id)
) ENGINE = InnoDB;

--在users库中创建order表
CREATE TABLE users.order(
  id INT NOT NULL AUTO_INCREMENT,
  user_id INT,
  price DECIMAL(10,2),
  PRIMARY KEY (id),
  KEY idx_user_id (user_id)
) ENGINE = InnoDB;

--在users库中创建log表
CREATE TABLE users.log(
  id INT NOT NULL AUTO_INCREMENT,
  user_id INT,
  content TEXT,
  PRIMARY KEY (id),
  KEY idx_user_id (user_id)
) ENGINE = InnoDB;

垂直分库

垂直分库是将一个数据库中的数据,按照不同的业务类型,分别存在不同的数据库中。例如,一个数据可能包含了用户信息、订单信息、商品信息等多种业务类型,将这些业务类型分别存在不同的数据库中,可以降低单一数据库的存储压力。

垂直分库的示例:

--创建user库
CREATE SCHEMA user;

--在user库中创建users表
CREATE TABLE user.users(
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(20),
  age INT,
  PRIMARY KEY (id)
) ENGINE = InnoDB;

--在product库中创建product表
CREATE SCHEMA product;

CREATE TABLE product.product(
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(20),
  price DECIMAL(10,2),
  PRIMARY KEY (id)
) ENGINE = InnoDB;

--在order库中创建order表
CREATE SCHEMA order;

CREATE TABLE order.order(
  id INT NOT NULL AUTO_INCREMENT,
  user_id INT,
  product_id INT,
  amount INT,
  PRIMARY KEY (id),
  KEY idx_user_id (user_id),
  KEY idx_product_id (product_id)
) ENGINE = InnoDB;

水平分表

水平分表是将一个表中的数据,拆分成多个表,并且这些表的结构相同。例如,一个电商业务的订单表(order)可能存储了大量的订单数据,将这个表拆分成多个表(例如,按年、按月、按日),可以有效的提高系统的查询效率。

水平分表的示例:

--创建order表
CREATE TABLE order.`order`(
  id INT NOT NULL AUTO_INCREMENT,
  user_id INT,
  product_id INT,
  price DECIMAL(10,2),
  amount INT,
  order_time DATETIME,
  PRIMARY KEY (id),
  KEY idx_user_id (user_id),
  KEY idx_product_id (product_id),
  KEY idx_order_time (order_time)
) ENGINE = InnoDB;

--按年创建表
CREATE TABLE order.order_2021(
  LIKE order.`order`
) ENGINE = InnoDB;

--按月创建表
CREATE TABLE order.order_202101(
  LIKE order.`order`
) ENGINE = InnoDB;
CREATE TABLE order.order_202102(
  LIKE order.`order`
) ENGINE = InnoDB;
--省略其他月份

--按日创建表
CREATE TABLE order.order_20210101(
  LIKE order.`order`
) ENGINE = InnoDB;
CREATE TABLE order.order_20210102(
  LIKE order.`order`
) ENGINE = InnoDB;
--省略其他日期

垂直分表

垂直分表是将一个表中的数据,按照不同的业务类型,拆分成多个表,并且这些表数据结构不同。例如,一个电商业务的商品表(product)包含了商品的基本信息、销量信息、促销信息等多个业务类型,将这些业务类型分别存在不同的表中,可以避免数据的冗余,提高系统的性能。

垂直分表的示例:

--创建product表
CREATE TABLE product.product(
  id INT NOT NULL AUTO_INCREMENT,
  name VARCHAR(20),
  description TEXT,
  price DECIMAL(10,2),
  PRIMARY KEY (id)
) ENGINE = InnoDB;

--创建product_sale表
CREATE TABLE product.product_sale(
  id INT NOT NULL AUTO_INCREMENT,
  product_id INT,
  count INT,
  PRIMARY KEY (id),
  KEY idx_product_id (product_id)
) ENGINE = InnoDB;

--创建product_promotion表
CREATE TABLE product.product_promotion(
  id INT NOT NULL AUTO_INCREMENT,
  product_id INT,
  promotion_price DECIMAL(10,2),
  promotion_start DATETIME,
  promotion_end DATETIME,
  PRIMARY KEY (id),
  KEY idx_product_id (product_id)
) ENGINE = InnoDB;

以上是MySQL的常用分表分库策略。在实际应用中,我们可以选择合适的分表分库策略,根据实际业务需求进行优化和调整。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql数据库分表分库的策略 - Python技术站

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

相关文章

  • 微服务架构-利用Redis特性进行业务解耦

    背景: 接着上篇文章来,上篇文章讲的是如何利用ApplicationContext的事件机制来达到业务解耦,而且这只能作用在单体应用中。在当下这么盛行的微服务架构中,想要再利用此方案做业务解耦是不可能的了,我们也提到,现在比较流行的解决方案是利用消息队列来完成,例如现在流行的RabbitMQ、RocketMQ、ActiveMQ,Kafka。    当然了,我…

    Redis 2023年4月11日
    00
  • 记一次Mysql不走日期字段索引的原因小结

    下面我将详细讲解“记一次Mysql不走日期字段索引的原因小结”的完整攻略。 一、背景 在实际开发过程中,我们通常会遇到需要根据日期字段进行查询的情况,而Mysql支持为这种查询创建日期字段索引,以提高查询效率。然而,在某些情况下,我们会发现Mysql并没有使用这个索引,而是进行了全表扫描,这时需要对问题进行排查,找出原因并解决。 二、问题排查步骤 出现这种情…

    database 2023年5月22日
    00
  • MySQL详细汇总常用函数

    MySQL详细汇总常用函数 MySQL中有很多常用的函数,这些函数可以帮助我们更加高效的进行数据查询和处理。本文将对MySQL中的常用函数进行汇总,并且给出相应的示例说明。 字符串函数 CONCAT CONCAT是将多个字符串进行拼接的函数。用法如下: CONCAT(str1, str2, str3, …) 示例: 假设我们有一个users表,其中存储了…

    database 2023年5月22日
    00
  • SQL 在Oracle中把标量子查询转换为复合子查询

    恩,Oracle 对于标量子查询(Scalar Subquery)和复合子查询(Correlated Subquery)采用了不同的优化方式。标量子查询每次执行都会返回一个单一的结果,而复合子查询每次执行返回多个结果集,并且需要跟外部查询进行关联。在某些情况下,我们需要将标量子查询转换为复合子查询以获得更好的性能和优化效果。 下面介绍两个实例,演示如何在Or…

    database 2023年3月27日
    00
  • 只有移动开发者才能拯救传统ISV、SI企业?

    只有移动开发者才能拯救传统ISV、SI企业 为什么移动开发者能拯救传统ISV、SI企业? 在当前移动互联网兴起和数字化转型的背景下,越来越多的企业重视移动化发展和互联网化思维,而这些变革需要移动开发者的支持和帮助。传统ISV(Independent Software Vendor,独立软件开发商)和SI(System Integrator,系统集成商)企业也…

    database 2023年5月21日
    00
  • Oracle客户端 NLS_LANG 的设置方法

    下面是关于“Oracle客户端 NLS_LANG 的设置方法”的完整攻略: 什么是 NLS_LANG? NLS_LANG 是 Oracle 数据库客户端的一个环境变量。它是用来指定字符集的参数,决定了客户端和服务器之间交换数据的字符集。如果客户端的 NLS_LANG 不正确,就可能会导致出现乱码、截断数据、数据异常等问题。 设置 NLS_LANG 在 Win…

    database 2023年5月22日
    00
  • PHP 分页类(模仿google)-面试题目解答

    首先,在这个面试题目中,我们需要讲解的是一个名为“PHP 分页类(模仿google)”的完整攻略。根据题目要求,我们需要使用markdown格式文本进行回答。 1. 简介 “PHP 分页类(模仿google)”是一种专门用于生成分页页面的工具类,可以将一个长列表分割成若干子列表来减少页面加载时间,提高用户体验。在本文中,我们将介绍如何使用这个分页类。 2. …

    database 2023年5月21日
    00
  • SQL Server存储过程生成insert语句实例

    首先我们需要明确什么是SQL Server存储过程。存储过程是一组预编译的SQL语句,可以通过一个名称调用并执行这些语句,它被存在数据库中作为一个对象,能够提高数据库的性能和安全性。而生成insert语句则是一种常见的用途,通常用于将数据从一个表复制到另一个表。 接下来,我们将介绍如何使用SQL Server存储过程生成insert语句。 第一步,创建存储过…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部