2016-04-11 86 views
-1

在我的Web應用程序中,我有一條可以進行兩次數據庫調用的路由。一個從mysql表中以降序獲得15個圖像路徑,並將它們打印到<img>標記,另一個循環整個表格以用於分頁目的。所以這些是兩個必然會減慢我的Web應用程序的調用,所以如果可能的話如何優化查詢。這裏是代碼:如何在node.js中更好地執行此MySQL查詢

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 }); 
    }); 

});

+0

'選擇ID FROM帖子? 「count」查詢怎麼辦? – ceadreak

+0

@ceadreak是的,那是一個愚蠢的錯誤。還有什麼我可以做的嗎? –

回答

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(沒有限制),其中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號都存在。)