我有一个 Node.js 应用程序,使用 Sequelize 作为 ORM 与 PostgreSQL 数据库交互。我的一个查询从一个可能包含数百万条记录且大约有 15-20 列的表中检索数据。该查询使用 rawSQL 查询根据日期范围和可选过滤器获取数据。这是查询功能的代码:
请指导我谢谢
这是我的代码
exports.getactivationData = async function (params, pagination = true) {
try {
let dbModels = await db.Models();
let query = `SELECT * FROM my_large_table WHERE date("createdAt") BETWEEN '${params.startDate}' AND '${params.endDate}'`;
if (!pagination) {
query = `SELECT count(*) FROM my_large_table WHERE date("createdAt") BETWEEN '${params.startDate}' AND '${params.endDate}'`;
}
if (params.filter1) {
query += ` AND sensitive_column_id = '${params.sensitiveFilterId}'`;
}
if (params.filter2) {
query += ` AND sensitive_column_value = '${params.sensitiveFilterValue}'`;
}
if (pagination && params.limit) {
query += ` ORDER BY "${params.sortBy}" ${params.sortType} `;
query += ` LIMIT '${params.limit}' OFFSET '${params.offset}'`;
}
const myLargeTableData = await db.sequelize.query(query, {
model: dbModels.myLargetableModel
});
return promiseAdapter.resolve(myLargeTableData);
} catch (error) {
return promiseAdapter.reject(error);
}
}
我担心此查询的性能,尤其是在处理大型数据集时(例如,获取 10 小时的数据会产生大约 62k 条记录)。在查询大型 PostgreSQL 表时,如何优化此 Sequelize 查询以提高其性能?
此外,在我的控制器中,我这样调用此函数:
let data = await reportmodel.getactivationData (params);
// For count
let resultCount = await reportmodel.getactivationData (params, false);
注意:我想要优化,如上所述,即使限制为 10 条记录,也需要花费近 30-40 秒的时间,因为默认情况下我使用限制 = 10。仍然需要很多时间
使用索引,在表中添加适当的索引以加快查询速度。有关更多信息,请参阅PostgreSQL-索引