const sql = `
select
${fields},
(select count(*) from vmall_product_provide_info_${tableIndex} ${whereStr})
as total
from vmall_product_provide_info_${tableIndex}
${whereStr}
${orderByStr}
limit ? offset ?
`;
result = await knexHelper.executeSql(sql, [limit, offset], database, env);
这段sql查询是通过额外建立一个子查询,同时来进行分页条件查询和查询数据总条数。
那么可不可以继续优化呢,答案是可以的。
我们可以借助sql的一个OFFSET FETCH 特性来一次性获取数据和总数,而不需要额外的查询。这样可以提高性能并减少数据库的负担。
const sql = `
SELECT
${fields},
(SELECT COUNT(*) FROM vmall_product_provide_info_${tableIndex} ${whereStr})
AS total
FROM vmall_product_provide_info_
${tableIndex} ${whereStr} ${orderByStr}
OFFSET ? FETCH NEXT ? ROWS ONLY
`;
result = await knexHelper.executeSql(sql, [offset, limit], database, env);