【问题标题】:How can I make this MySQL query better in node.js如何在 node.js 中使这个 MySQL 查询更好
【发布时间】:2016-04-11 16:04:37
【问题描述】:

在我的网络应用程序中,我有一个进行两次数据库调用的路由。一个以降序从 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 });
    });

});

【问题讨论】:

  • SELECT ID FROM posts ? count 查询呢???
  • @ceadreak 是的,这是一个愚蠢的错误。还有什么我可以做的吗?

标签: mysql node.js


【解决方案1】:

尝试使用此查询来获取行数,而不是 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(没有限制),其中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 号,则页面完全丢失。)

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 2019-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    相关资源
    最近更新 更多