热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
针对数据库查询提供优化建议,分析更改对执行时间与资源使用的影响,帮助开发者提升查询性能和系统效率,适用于全栈开发和数据库性能调优场景。
过滤与连接顺序
聚合与去重
Top-N 排序
结论:缺少关键组合与覆盖索引、连接驱动不稳定、过晚聚合,是主要性能瓶颈。
说明:以上索引的列顺序是结合谓词类型(IN/等值优先,范围其次)与覆盖需求做的权衡;orders 的(status, created_at, ...) 顺序优于(created_at, status, ...),因为 IN+范围的联合扫描更有效(先按少量 status 值分段,再按 created_at 做范围)。
思路:
WITH
filtered_orders AS (
SELECT /* 覆盖扫描 */
o.id, o.customer_id
FROM orders o
FORCE INDEX (idx_orders_status_created_customer_id_id)
WHERE o.status IN ('paid','shipped')
AND o.created_at >= '2025-10-25'
AND o.created_at < '2025-11-25'
),
order_totals AS (
SELECT /* 在订单范围内做明细聚合,行数显著降低为“每单一行” */
oi.order_id,
SUM(oi.quantity * oi.unit_price) AS order_total
FROM order_items oi
JOIN filtered_orders fo
ON fo.id = oi.order_id
JOIN products p
ON p.id = oi.product_id
WHERE p.category IN ('electronics','home')
GROUP BY oi.order_id
),
by_customer AS (
SELECT fo.customer_id,
SUM(ot.order_total) AS total_spent,
COUNT(*) AS orders_count -- 每单唯一一行,直接 COUNT(*)
FROM filtered_orders fo
JOIN order_totals ot
ON ot.order_id = fo.id
GROUP BY fo.customer_id
)
SELECT c.id, c.name,
bc.total_spent,
bc.orders_count
FROM by_customer bc
JOIN customers c ON c.id = bc.customer_id
ORDER BY bc.total_spent DESC
LIMIT 50;
关键点:
SELECT c.id, c.name,
bc.total_spent,
bc.orders_count
FROM (
SELECT fo.customer_id,
SUM(ot.order_total) AS total_spent,
COUNT(*) AS orders_count
FROM (
SELECT /* 先过滤订单 */
o.id, o.customer_id
FROM orders o
FORCE INDEX (idx_orders_status_created_customer_id_id)
WHERE o.status IN ('paid','shipped')
AND o.created_at >= '2025-10-25'
AND o.created_at < '2025-11-25'
) AS fo
JOIN (
SELECT oi.order_id,
SUM(oi.quantity * oi.unit_price) AS order_total
FROM order_items oi
JOIN products p
ON p.id = oi.product_id
WHERE p.category IN ('electronics','home')
GROUP BY oi.order_id
) AS ot
ON ot.order_id = fo.id
GROUP BY fo.customer_id
) AS bc
JOIN customers c
ON c.id = bc.customer_id
ORDER BY bc.total_spent DESC
LIMIT 50;
说明:
组合覆盖索引:orders(status, created_at, customer_id, id)
覆盖索引:order_items(order_id, product_id, quantity, unit_price)
预聚合到订单级(order_totals)
稳定驱动顺序(通过派生表/CTE + 索引)
排序与 LIMIT 50
-- orders:状态 + 时间窗 + 覆盖连接列
CREATE INDEX idx_orders_status_created_customer_id_id
ON orders(status, created_at, customer_id, id);
-- order_items:按订单驱动且覆盖计算列
CREATE INDEX idx_oi_order_prod_qty_price
ON order_items(order_id, product_id, quantity, unit_price);
-- products:按分类快速取 product_id
CREATE INDEX idx_products_category_id
ON products(category, id);
WITH
filtered_orders AS (
SELECT o.id, o.customer_id
FROM orders o
FORCE INDEX (idx_orders_status_created_customer_id_id)
WHERE o.status IN ('paid','shipped')
AND o.created_at >= '2025-10-25'
AND o.created_at < '2025-11-25'
),
order_totals AS (
SELECT oi.order_id,
SUM(oi.quantity * oi.unit_price) AS order_total
FROM order_items oi
JOIN filtered_orders fo ON fo.id = oi.order_id
JOIN products p ON p.id = oi.product_id
WHERE p.category IN ('electronics','home')
GROUP BY oi.order_id
),
by_customer AS (
SELECT fo.customer_id,
SUM(ot.order_total) AS total_spent,
COUNT(*) AS orders_count
FROM filtered_orders fo
JOIN order_totals ot ON ot.order_id = fo.id
GROUP BY fo.customer_id
)
SELECT c.id, c.name,
bc.total_spent,
bc.orders_count
FROM by_customer bc
JOIN customers c ON c.id = bc.customer_id
ORDER BY bc.total_spent DESC
LIMIT 50;
以上优化严格围绕该查询的过滤、连接与聚合路径重构,并通过组合/覆盖索引配合,达到减少扫描、降低回表、缩小中间结果与精简聚合的目标,从而显著缩短执行时间。
下面对给定聚合进行诊断并给出可直接应用的优化方案,包括索引设计、查询改写与执行参数调整,重点针对并发性能与总体吞吐量提升。
并发下的关键目标是:最大程度将过滤下推到索引、减少扫描量和FETCH次数、降低分组内存与I/O,从而缩短持有资源的时间。
db.actions.createIndex(
{ eventType: 1, ts: 1, userId: 1 },
{ name: "evt_ts_user_cover" }
)
db.actions.createIndex(
{ eventType: 1, ts: 1, userId: 1 },
{
name: "evt_ts_user_cover_partial",
partialFilterExpression: { eventType: { $in: ["login", "view", "purchase"] } }
}
)
选择全量 vs 部分索引:如果查询只关心 login/view/purchase,优先使用部分索引,体积更小、维护成本更低;如果还会查询其他 eventType,再使用全量索引。
将 $in 改写为 $or 的多个子谓词,可使优化器构造更明确的多分支范围扫描(通常与复合索引配合能得到更紧的边界):
{ $match: {
$or: [
{ eventType: "login", ts: { $gte: ISODate("2025-11-01"), $lt: ISODate("2025-11-30") } },
{ eventType: "view", ts: { $gte: ISODate("2025-11-01"), $lt: ISODate("2025-11-30") } },
{ eventType: "purchase", ts: { $gte: ISODate("2025-11-01"), $lt: ISODate("2025-11-30") } }
]
} }
{ $project: { _id: 0, userId: 1, ts: 1 } }
{ hint: "evt_ts_user_cover_partial" } // 或 { eventType:1, ts:1, userId:1 }
对月度 Top-100 的类报表查询,采用“按天按用户聚合”的物化表,运行时只需对日级摘要再聚合:
// 仅对 login/view/purchase 建立部分覆盖索引(更小,更快,更少写入开销)
db.actions.createIndex(
{ eventType: 1, ts: 1, userId: 1 },
{
name: "evt_ts_user_cover_partial",
partialFilterExpression: { eventType: { $in: ["login", "view", "purchase"] } }
}
);
或,如需覆盖所有事件类型:
db.actions.createIndex(
{ eventType: 1, ts: 1, userId: 1 },
{ name: "evt_ts_user_cover" }
);
db.actions.aggregate(
[
{
$match: {
$or: [
{ eventType: "login", ts: { $gte: ISODate("2025-11-01"), $lt: ISODate("2025-11-30") } },
{ eventType: "view", ts: { $gte: ISODate("2025-11-01"), $lt: ISODate("2025-11-30") } },
{ eventType: "purchase", ts: { $gte: ISODate("2025-11-01"), $lt: ISODate("2025-11-30") } }
]
}
},
// 仅保留后续需要的字段,配合覆盖索引减少FETCH与内存传递
{ $project: { _id: 0, userId: 1, ts: 1 } },
// 按用户聚合
{ $group: { _id: "$userId", evt_cnt: { $sum: 1 }, lastSeen: { $max: "$ts" } } },
// Top-N 排序 + 限制
{ $sort: { evt_cnt: -1, lastSeen: -1 } },
{ $limit: 100 }
],
{
allowDiskUse: true,
hint: "evt_ts_user_cover_partial" // 或 { eventType:1, ts:1, userId:1 }
}
);
如果不想改写为 $or,仍可沿用 $in,但保留其他优化:
db.actions.aggregate(
[
{
$match: {
ts: { $gte: ISODate("2025-11-01"), $lt: ISODate("2025-11-30") },
eventType: { $in: ["login","view","purchase"] }
}
},
{ $project: { _id: 0, userId: 1, ts: 1 } },
{ $group: { _id: "$userId", evt_cnt: { $sum: 1 }, lastSeen: { $max: "$ts" } } },
{ $sort: { evt_cnt: -1, lastSeen: -1 } },
{ $limit: 100 }
],
{
allowDiskUse: true,
hint: { eventType: 1, ts: 1, userId: 1 }
}
);
db.getMongo().setReadPref("secondary"); // 会话级
// 或在驱动层设置 readPreference=secondary
每日聚合流水(可定时任务),将原始 actions 汇总到 user_event_daily:
// 以天为粒度预聚合(可每日跑一次,或滚动窗口)
db.actions.aggregate([
{
$match: {
ts: { $gte: ISODate("2025-11-01"), $lt: ISODate("2025-12-01") },
eventType: { $in: ["login","view","purchase"] }
}
},
{ $project: { userId: 1, day: { $dateTrunc: { date: "$ts", unit: "day" } }, ts: 1 } },
{
$group: {
_id: { userId: "$userId", day: "$day" },
cnt: { $sum: 1 },
lastSeen: { $max: "$ts" }
}
},
{
$merge: {
into: "user_event_daily",
on: ["_id"],
whenMatched: "merge",
whenNotMatched: "insert"
}
}
], { allowDiskUse: true, hint: { eventType: 1, ts: 1, userId: 1 } });
月度 Top-100 查询只需对日表聚合:
db.user_event_daily.aggregate([
{ $match: { "_id.day": { $gte: ISODate("2025-11-01"), $lt: ISODate("2025-12-01") } } },
{
$group: {
_id: "$_id.userId",
evt_cnt: { $sum: "$cnt" },
lastSeen: { $max: "$lastSeen" }
}
},
{ $sort: { evt_cnt: -1, lastSeen: -1 } },
{ $limit: 100 }
], { allowDiskUse: true });
以上优化可在中型数据量(1万~100万)下带来显著并发性能提升与更稳定的尾延迟表现,且兼顾后续规模扩展。
帮助用户快速优化数据库查询性能,提升系统运行效率并最大程度减少资源消耗,同时提供优化解释以便用户了解修改原因与其带来的性能影响。
通过该工具快速排查性能瓶颈,优化复杂查询语句,显著提升数据库服务效率与稳定性。
无需深度掌握数据库优化技术,即可通过该提示轻松提高代码查询性能,加速产品交付。
优化数据查询效率,为分析流程提速,同时全面了解查询更改对数据性能的影响。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
半价获取高级提示词-优惠即将到期