如何在node.js中更好地进行MySQL查询

时间:2016-04-11 16:04:38

标签: mysql node.js

在我的网络应用程序中,我有一个进行两次数据库调用的路由。一个从mysql表中按降序获取15个图像路径,并将它们打印到<img>标签,另一个用于循环整个表以进行分页。所以这两个调用必然会减慢我的网络应用程序速度,所以如果可能的话我该如何优化查询。这是代码:

router.get('/board', function(req, res){
//GET PAGE NUMBER FOR PAGINATION
if(req.query.page){
    var page = parseInt(req.query.page);
}else{
    page = 1;
}
var start_from = (page - 1) * 15,
    rows,
    total_pages,
    getPages = connection.query('SELECT COUNT(*) FROM posts', function(err, result){
        rows = result.length;
        total_pages = parseInt(Math.ceil(rows / 15));
    }),
    sql = connection.query('SELECT ID, Title, Img_path FROM posts ORDER BY ID DESC LIMIT ' + start_from + ', 15', function(err, result){    
        res.header("Content-Type", "text/html; charset=utf-8");
        res.render('board', {print: result, pages: total_pages, page_no: page });
    });

});

1 个答案:

答案 0 :(得分:0)

尝试使用此查询来获取行计数而不是SELECT COUNT(1) FROM posts,即使result.length有效,您仍然在检索可能没有实际执行任何操作的大量整数。

对于使用ORDER BY ID DESC LIMIT x, 15的分页结果,最有可能提供帮助的建议(因为它确实需要每次都对整个表进行排序)是将其更改为WHERE ID BETWEEN (x-1) and (x - 15) ORDER BY ID DESC(没有limit),其中x是在上一个查询/页面上检索到的最低ID。

当然,这会使“后退”和“前进”复杂化。您可以将第一个查询设置为SELECT (ID-1) DIV 15 AS pageNum, MIN(ID), MAX(ID) FROM posts GROUP BY pageNum,并将结果实际保存到数组中,并将它们用作已知页面边界。其缺点是:(1)您需要调整显示的页码,以便较高的ID值不在最后一页上,(2)如果添加了任何新图像,将定期检查。如果ID是自动增量,这应该只是检查是否有任何超过您当前最高的最大值。

此外,如果您在ID值之间存在差距,您可能会得到一些少于15的页面(如果没有在该范围内出现的ID号,则会完全丢失页面。)

相关问题