首页 > 解决方案 > 如何优化 postgresql 查询?

问题描述

我将 node js 与 postgresql 一起使用,并且我试图在每个对话中获取用户的最后一条消息。所以我从 3 个查询中获取数据,然后将它们相加并将它们存储在一个数组中,以便我可以返回它。此代码可以正常工作,但有时它会很好地返回数据,有时会丢失一些数据。

我认为问题在于代码执行时间太长,因此没有足够的时间返回所有数据。所以我想知道是否有另一种方法或 postgresql 函数可以用来优化这段代码。

router.get("/api/messagesUser", verifToken, (req, res) => {
    pool.query(
        "SELECT * from public.discussion AS D where D.user = $1",
        [req.user.id],
        (err, result) => {
            if (err)
                return res
                    .status(400)
                    .send({ message: "une erreur s'est produite, veuillez réessayer." });
            else if (result.rowCount > 0) {
                const arr = [];

                result.rows.map(async (val, index) => {
                    await pool.query(
                        `SELECT * from public.boutique AS B, public."page_layout" AS P
                        WHERE B.id = P."id_boutique" 
                        AND B.id = $1`,
                        [val.boutique],
                        async (err, result2) => {
                            if (err)
                                return res.status(400).send({
                                    message: "une erreur s'est produite, veuillez réessayer.",
                                });
                            else if (result2.rowCount > 0) {
                                await pool.query(
                                    `SELECT contenu, sender, date from public.messages
                                    WHERE id_discussion = $1
                                    ORDER BY date DESC 
                                    LIMIT 1`,
                                    [val.id],
                                    async (err, result3) => {
                                        if (err)
                                            return res.status(400).send({
                                                message:
                                                    "une erreur s'est produite, veuillez réessayer.",
                                            });
                                        else if (result3.rowCount > 0) {
                                            const data = result2.rows[0];
                                            data["message"] = result3.rows[0].contenu;
                                            data["id_discussion"] = val.id;
                                            data["date"] = result3.rows[0].date;
                                            result3.rows[0].sender == req.user.id
                                                ? (data["lastSender"] = "user")
                                                : (data["lastSender"] = "boutique");

                                            await arr.push(result2.rows[0]);

                                            if (index == result.rowCount - 1)
                                                return res.status(200).send(arr);
                                        } else if (index == result.rowCount - 1)
                                            return res.status(200).send(arr);
                                    }
                                );
                            }
                        }
                    );
                });
            } else {
                res.status(200).send([]);
            }
        }
    );
});

标签: node.jspostgresql

解决方案


推荐阅读