我在 Node.js (v16.x) 项目中使用 Sequelize v6.23.0。
查询执行时间非常长。因此,我对 Sequelize 和 MySQL2 库进行了快速比较。执行时间差异非常显着。 MySQL2 似乎更快。是预期的吗?或者我们需要调整任何配置吗?
对比结果:
选择查询:
Sequelize: 23.29845 ms
MySQL2: 2.010144 ms
更新查询:
Sequelize: 27.175449 ms
MySQL2: 5.979536 ms
插入查询:
Sequelize: 31.414926 ms
MySQL2: 7.720711 ms
注意: 目前,我只是在 Sequelize 和 MySQL2 中执行原始查询。请帮我解决这个问题!
您观察到的 Sequelize 和 MySQL2 之间执行时间的显着差异在某种程度上是预期的,但可能没有达到您所看到的程度。以下是发生这种情况的原因的详细说明,以及您可以考虑提高 Sequelize 性能的一些策略:
抽象开销:Sequelize 是一个 ORM(对象关系映射)库,这意味着它在与数据库交互的原始 SQL 上提供了一个抽象层。这种抽象简化了数据库交互,但可能会带来开销,因为它会自动处理连接池、数据映射、模型验证以及从对象和方法构建 SQL 查询等任务。
生成的 SQL:与 MySQL2 中使用的原始 SQL 相比,Sequelize 生成的 SQL 可能更复杂或优化程度较低。这可以在性能上产生相当大的差异,尤其是对于更复杂的查询或模式。
其他功能:Sequelize 包含许多功能,例如关联、挂钩和事务,即使不使用,这些功能仍可能会影响查询的初始化和执行路径。
针对性能关键部分的原始查询:对于应用程序中性能至关重要的部分,请考虑通过 Sequelize 使用原始 SQL 查询。这允许您绕过一些开销,同时仍然利用 Sequelize 进行更简单或不太重要的数据库交互。您可以在 Sequelize 中运行原始查询,如下所示:
const result = await sequelize.query("YOUR_RAW_SQL_QUERY", { type: sequelize.QueryTypes.SELECT });
连接池:确保 Sequelize 配置为有效使用连接池。这可以减少建立数据库连接所花费的时间。这是一个示例配置:
const sequelize = new Sequelize(database, username, password, {
host: 'localhost',
dialect: 'mysql',
pool: {
max: 10,
min: 0,
acquire: 30000,
idle: 10000
}
});
优化 Sequelize 设置:查看并调整其他 Sequelize 设置:
分析生成的SQL:查看Sequelize生成的SQL(您可以通过在Sequelize配置中设置
logging: console.log
来记录它)。有时,了解生成的 SQL 可以帮助您优化 Sequelize 查询或模型。
分析和优化查询:使用分析工具(如 MySQL 的
EXPLAIN
或慢速查询日志)来了解查询的执行方式以及瓶颈所在。这可能会让您深入了解某些查询是否需要在 SQL 级别或模型/配置级别进行优化。
更新依赖项:确保所有相关依赖项都是最新的,因为新版本中可能会有性能改进。
通过实施这些策略,您可以帮助缩小 Sequelize 和 MySQL2 之间的性能差距,尽管使用 ORM 的一些开销可能仍然存在。如果性能是绝对优先考虑的,并且 ORM 的好处不超过开销,请考虑在应用程序的更多部分甚至整个应用程序中使用 MySQL2。