在 Web 开发中,数据量的增长是一个不可避免的问题。一旦数据库中的数据量变得非常大,性能问题和并发问题就会出现。为了解决这些问题,用户经常使用分库分表方法去升级数据库性能。在这篇文章中,我们将讨论如何在 Sequelize 中实现分库分表。
什么是 Sequelize?
Sequelize 是一个 Node.js 的异步 ORM(对象关系映射)库,它支持多种数据库,包括 MySQL、MariaDB、SQLite、PostgreSQL 和 MSSQL 。Sequelize 支持多种类型的关系型数据库,不论您使用哪种关系型数据库,它都可以将您的数据存储在数据库中。
基础知识
在开始分库分表之前,您必须先理解两个基本概念:分库和分表。
分库
当数据量变得巨大时,您需要拆分您的数据库。分库是指把单个数据库中的数据分成多个数据库。分库可以使不同的数据集在不同的数据库中,并且每个数据库都有相同的结构。每个数据库都可以被放置在不同的服务器上,并且数据可以在这些数据库之间划递归地分布。
分表
分表是指将一个非常大的数据表拆分成多个数据表。在分表策略中,该表中的数据根据其重复性或频繁性或其它规则被分发到多个表中。
分库分表实现
下面是一个使用 Sequelize 实现分库分表的示例。我们将使用 MySQL 数据库。
我们将通过将 ActiveRecord 与 MySQL 分区表一起使用来实现分库分表。Sequelize 支持使用模型定义对分区表的建模。
首先创建一个名为 provider.js 的模型
-- -------------------- ---- -------
----- --------- - ---------------------
----- --------- - --- ----------------- ------- --- -
----- ------------
-------- --------
-------- -----
---
----- -------- - ---------------------------- -
--- -
----- ------------------
----------- -----
-------------- ----
--
----- -
----- -----------------
---------- -----
--
------------ -
----- ---------------
---------- -----
-
---
-------------- - ---------其中 sequelize.define()是使用 SequelizeJS 进行建表操作,Provider 数据表的 SCHEMA 如下:
CREATE TABLE `provider` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `description` text NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
1. 分库
现在我们有一个供应商表,它具有一个 ID、名称和描述字段。
我们想将供应商表分成两个库。
假设我们有两个数据库 db1 和 db2,我们将在这些数据库中创建表,并将它们设置为站点可用。
以下是新的 provider.js 文件:
-- -------------------- ---- -------
----- --------- - ---------------------
----- ---------- - --- ------------------ ------- --- -
----- ------------
-------- --------
-------- ------
---
----- ---------- - --- ------------------ ------- --- -
----- ------------
-------- --------
-------- ------
---
----- --------- - ----------------------------- -
--- -
----- ------------------
----------- -----
-------------- ----
--
----- -
----- -----------------
---------- -----
--
------------ -
----- ---------------
---------- -----
-
-- -
------- -----
---
----- --------- - ----------------------------- -
--- -
----- ------------------
----------- -----
-------------- ----
--
----- -
----- -----------------
---------- -----
--
------------ -
----- ---------------
---------- -----
-
-- -
------- -----
---
-------------- - ----------- -----------我们将使用到两个 MySQL 数据库,将 provider 数据表从 provider1 和 provider2 中分开。
通过设置 schema 关键字,我们可以轻松定义模型在哪个数据库中工作。在这种情况下,我们有两个数据库:db1 和 db2。这通过以下方式在 MySQL 中创建:
CREATE SCHEMA `db1` DEFAULT CHARACTER SET utf8mb4 ; CREATE SCHEMA `db2` DEFAULT CHARACTER SET utf8mb4 ;
2. 分表
首先,我们需要定义模型,使用模型定义模型的属性:
-- -------------------- ---- -------
----- --------- - ---------------------
----- -------- - ---------------------------- -
--- -
----- ------------------
----------- -----
-------------- -----
--
----- -
----- -----------------
---------- ------
--
------------ -
----- ---------------
---------- ------
--
-- - ---------- ----------- ---
----- --------- - ----------------------------- -
--- -
----- ------------------
----------- -----
-------------- -----
--
----- -
----- -----------------
---------- ------
--
------------ -
----- ---------------
---------- ------
--
-- - ---------- ----------- ---
-------------- - ---------- -----------请注意,在定义表时,我们使用 tableName 属性定义实际表名。
如果要分区,可以使用 Sequelize.RANGE、Sequelize.HASH 或 Sequelize.List。在这种情况下,我们可以使用 Sequelize.RANGE 将表键分区成基于值的组。下面是如何在 provider.js 文件中定义 provider1 表的示例:
-- -------------------- ---- -------
----- --------- - ---------------------
----- --------- - ----------------------------- -
--- -
----- ------------------
----------- -----
-------------- -----
--
----- -
----- -----------------
---------- ------
--
------------ -
----- ---------------
---------- ------
--
-- -
---------- ------------
-------- -
-
------- -------
------ -------
----- -----------------------
-
--
-- -- -- -- ----- -- ------ -- ------ -- -------
-- -------------- ----- -- --- ------ -- ---- --- ------
-- ----- ------ --- --------- --- ------------- -------- ----
-- ---- -------------- ------ --- ----------- ---------
------------- -----
--------------- ---
-------------- --------------------
---
-------------- - ----------上面的代码使用 Sequelize.HASH 将表键分区为基于哈希值的组,并创建名为 hash_index_provider1 的哈希索引。
partitionKey 表示用于分区的键,partitionCount 是选择分区时要使用的分区数,partitionSize 是每个分区可以包含的行数。
将表分区并未在代码中手动执行分区操作,分片的操作是由 Sequelize 自动处理的。
现在我们可以定义模型,而不必担心 Sequelize 帮助我们处理分区。要查询这个模型,您需要确保在查询时设置根据模型定义的名称查询数据库表。例如,在查询 provider1 表时,您需要使用以下 SQL 查询:
SELECT * FROM provider1 WHERE ...
总结
在本文中,我们讨论了如何使用 Sequelize 在 MySQL 数据库上实现分库分表。在“分库”部分中,我们看到如何使用 MySQL 的 schema 属性将模型分布在不同的数据库中。在“分表”部分中,我们介绍了如何使用 SequelizeJS 分区表来定义分区策略,然后使用 Sequelize 将其映射到实现的底层 MySQL 表。这两种方法可以有效地提高数据库性能和可靠性。
您可以在自己的项目中实现这些策略,以便对大型数据库架构进行优化。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/64c9cdf45ad90b6d04182f7f