使用sequelize.js和mysql时性能非常差

5
我正在使用Feathers.js框架和Sequelize.js作为数据库适配器开发Node后端。总体来说,在从后端查询数据时,我发现性能非常差。最差的性能示例是查询一个具有约25个列和10,000个条目的表。我可以使用MySQL Workbench在0.013秒+ 0.352秒的提取时间(网络)内查询此表中的每个条目。但是,当使用Sequelize查询相同的查询时,平均需要2.5秒(孤立请求)才能完成查询。使用命令行生成服务包括数据库请求的方法是使用feathers-sequelize包。我已经尝试过增加Sequelize可以使用的连接池,但没有成功。在我的测试示例中,我没有使用任何其他参数或连接查询。调试时,它会生成下面的Sequelize调用: ``` sequelize.models.service_name.findAll(); ``` 我意识到从数据库转换二进制数据为JSON需要一些时间,但我认为应该能够在0.4秒内完成此请求。

你是测整个请求还是只测查询时间? - Roland Starke
尝试启用日志记录,您应该能够了解查询时间的情况,您还可以设置 raw: true 以不将结果解析为实例:sequelize.models.service_name.findAll({ logging: true, raw: true ); - doublesharp
我在后端测量整个请求,与mysql workbench中的查询本身进行比较。@doublesharp 我使用了相同的SQL语句进行查询,这些语句是从启用日志记录中获取的。我还使用了原始查询,但并没有提高性能。 - Somsky
日志的最后一部分是语句执行的时间。你需要找出哪部分比较慢,以便进一步调试。 - doublesharp
1个回答

2
我在一个有20000条记录的表格上遇到了一些性能问题,但我不会说这完全是Sequelize的问题。我可以列出帮助我改善性能的措施。
1. 在HasMany includes中使用Sequelize的`separate: true`(更多信息请参考此线程:Sequelize中'separate'是什么意思?) 2. 在通配符搜索中不要加前缀`%` - SELECT * FROM players WHERE first_name LIKE "JOHN%"; - 比 - SELECT * FROM players WHERE first_name LIKE "%JOHN%"; - 更快(这个网站解释了MySQL的性能优化:https://use-the-index-luke.com/sql/where-clause/searching-for-ranges/like-performance-tuning) 3. 为经常使用的属性在`WHERE`条件和`ORDER`子句中创建索引。
创建索引 player_search_index 在 player 表上的 (first_name, last_name, rank) 列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接