热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
本提示词可针对指定数据库类型优化SQL语句,并提供详细优化思路和原因解释,帮助开发者提升查询性能,降低资源消耗,适用于全栈开发和数据库性能调优场景。
下面是一套从“语句重写 + 索引/结构优化 + 执行计划控制”三个层面给出的优化方案,以及原因说明。先给出改写后的查询,再逐项解释。
一、推荐查询重写(保持结果一致,消除非SARGable、尽量提前过滤)
说明:
用时间范围替代 DATE(o.created_at) BETWEEN ...,让 created_at 可使用索引(SARGable)。
大多数 MySQL 字符列默认就是不区分大小写的排序规则(如 utf8mb4_0900_ai_ci),在这种情况下可直接用 c.region LIKE '%east%' 达到与 LOWER(region) LIKE '%east%' 同等语义;为了安全起见显式加 COLLATE。
LIKE '%east%' 由于前导通配符仍无法使用 customers.region 索引,但至少避免了对列的函数调用。
版本B:先过滤订单,再连接明细(减少 order_items 的参与数据量,便于优化器使用最优连接顺序) WITH filtered_orders AS ( SELECT id, customer_id, DATE(created_at) AS order_day FROM orders WHERE created_at >= CURRENT_DATE - INTERVAL 30 DAY AND created_at < CURRENT_DATE + INTERVAL 1 DAY AND status IN ('PAID','SHIPPED') ) SELECT c.region, fo.order_day, SUM(oi.quantity * oi.unit_price) AS revenue FROM filtered_orders fo JOIN order_items oi ON oi.order_id = fo.id JOIN customers c ON c.id = fo.customer_id WHERE c.region LIKE '%east%' COLLATE utf8mb4_0900_ai_ci GROUP BY c.region, fo.order_day ORDER BY revenue DESC;
说明:
先把 orders 缩到过去30天且目标状态的子集(约50万行),再与 order_items(用 order_id 索引)连接,能显著降低 join 的参与规模。
MySQL 8 的 CTE 通常会被内联,但这种写法让意图更加明确,也更利于你用 EXPLAIN 观察过滤是否在连接前就生效。
版本C:对 order_items 先“按订单汇总”,再与已过滤的订单集合做二次汇总(把“按明细汇总”换成“先对订单求小计”,显著降低分组/排序负担) WITH filtered_orders AS ( SELECT id, customer_id, DATE(created_at) AS order_day FROM orders WHERE created_at >= CURRENT_DATE - INTERVAL 30 DAY AND created_at < CURRENT_DATE + INTERVAL 1 DAY AND status IN ('PAID','SHIPPED') ), item_sum AS ( SELECT oi.order_id, SUM(oi.quantity * oi.unit_price) AS order_revenue FROM order_items oi JOIN filtered_orders fo ON fo.id = oi.order_id GROUP BY oi.order_id ) SELECT c.region, fo.order_day, SUM(isum.order_revenue) AS revenue FROM filtered_orders fo JOIN item_sum isum ON isum.order_id = fo.id JOIN customers c ON c.id = fo.customer_id WHERE c.region LIKE '%east%' COLLATE utf8mb4_0900_ai_ci GROUP BY c.region, fo.order_day ORDER BY revenue DESC;
说明:
二、索引与结构调整建议(让执行计划更好地利用索引,并尽量覆盖)
orders(过滤维度:status + created_at,连接所需:id、customer_id) 建议新增复合索引,使过滤与连接列在同一个索引里,尽量覆盖: CREATE INDEX IDX_orders_status_created_customer_id_id ON orders (status, created_at, customer_id, id);
原理:
order_items(汇总维度:order_id;计算列:quantity、unit_price) 为了让 item_sum 能“索引覆盖 + 尽量不回表”,增加如下索引: CREATE INDEX IDX_oi_order_qty_price ON order_items (order_id, quantity, unit_price);
原理:
customers(region 过滤)
三、执行计划与操作细节
关键的 SARGable 改动
连接与分组策略
排序成本与返回量
四、可选的结构性优化(视业务接受度)
分区(orders 按时间范围查询频繁)
生成列优化分组(可选)
五、预期 EXPLAIN 变化(理想情况)
六、结论与权衡
如需,我可以基于你的 MySQL 版本与 EXPLAIN 输出,给出更具体的执行计划对比与参数建议。
下面给出可直接替换的查询改写、索引与参数调优建议,并逐条说明优化原因,聚焦于执行计划、资源消耗、查询效率、索引使用。
一、SQL改写(去掉CTE屏障、让规划器可并行/内联、使用可命中GIN的JSONB谓词) -- 目标:在一次聚合内完成,尽量让优化器自由重排/并行,减少不必要的物化与I/O SELECT category_id, product_id, total_qty, total_amount FROM ( SELECT p.category_id, s.product_id, SUM(s.qty) AS total_qty, SUM(s.amount) AS total_amount, ROW_NUMBER() OVER ( PARTITION BY p.category_id ORDER BY SUM(s.amount) DESC ) AS rn FROM sales s JOIN ( SELECT id, category_id FROM products WHERE status = 'active' AND attrs @> '{"season":"winter"}' -- 利用GIN的@>包含查询 ) p ON p.id = s.product_id WHERE s.sold_at >= now() - interval '90 day' GROUP BY p.category_id, s.product_id ) x WHERE rn <= 10 ORDER BY category_id, total_amount DESC;
与原SQL相比的关键点
二、索引优化建议(按收益从高到低)
三、执行计划预期与验证要点
四、运行参数与统计建议
五、进一步的结构性优化(若该查询高频)
六、为什么这些优化有效(对应你的关切点)
七、落地执行顺序(建议)
如你能提供EXPLAIN (ANALYZE, BUFFERS) 的实际输出,我可以进一步对节点与行数估计偏差、是否并行、是否溢出等进行针对性微调。
下面给出可落地的改造方案与原因说明,目标是让查询在“最近7天的Tasks”上高效聚合,并让用户邮箱筛选可走索引,降低排序与内存授予成本。
一、核心问题与思路
二、推荐的模式与索引改造
新增持久化计算列 EmailDomain,并建索引: ALTER TABLE dbo.Users ADD EmailDomain AS LOWER(SUBSTRING(Email, CHARINDEX('@', Email) + 1, 256)) PERSISTED;
CREATE INDEX IX_Users_EmailDomain ON dbo.Users(EmailDomain) INCLUDE (UserId, Email);
如果主要筛选就是 example.com,叠加一个高度选择性的过滤索引(更小更快): CREATE INDEX FI_Users_EmailDomain_example ON dbo.Users(EmailDomain) INCLUDE (UserId, Email) WHERE EmailDomain = N'example.com';
说明:
备选方案(若不能改造EmailDomain列):
建反转邮箱列实现前缀LIKE: ALTER TABLE dbo.Users ADD EmailReversed AS REVERSE(Email) PERSISTED;
CREATE INDEX IX_Users_EmailReversed ON dbo.Users(EmailReversed) INCLUDE (UserId, Email);
查询改为 WHERE u.EmailReversed LIKE N'moc.elpmaxe@%',这是“前缀LIKE”,可走索引Seek。
说明:
可选:如果已有分区(按CreatedAt),确保分区消除;若没有、且任务量巨大,考虑按月/周分区,以便此类时间窗口查询只触碰少量分区。
三、查询重写(去UDF、等值匹配、半开区间、先聚合再连接) 示例(建议版): DECLARE @dt_end DATETIME2 = SYSUTCDATETIME(); DECLARE @dt_start DATETIME2 = DATEADD(DAY, -7, @dt_end);
WITH TaskAgg AS ( SELECT t.AssignedTo, SUM(t.DurationMinutes) AS total_minutes FROM dbo.Tasks AS t WITH (INDEX(IX_Tasks_Created_Assigned_Incl)) WHERE t.CreatedAt >= @dt_start AND t.CreatedAt < @dt_end -- 半开区间,边界更清晰 GROUP BY t.AssignedTo ) SELECT TOP (100) u.UserId, u.Email, ta.total_minutes FROM TaskAgg AS ta JOIN dbo.Users AS u ON u.UserId = ta.AssignedTo WHERE u.EmailDomain = N'example.com' -- 等值匹配,走索引 ORDER BY ta.total_minutes DESC OPTION (RECOMPILE); -- 让优化器以当前常量选择更优计划(尤其当选择性很高)
说明:
四、执行计划期望变化
五、维护与可维护性建议
六、如果不改造Schema的临时折中
总结
帮助用户快速优化特定数据库类型的SQL查询语句,提高查询效率,并通过详细的优化思路讲解,增强用户的SQL性能调优能力。
快速识别并优化低效SQL语句,提升数据库性能,保护系统稳定性并节省硬件资源。
优化复杂查询逻辑,使得大规模数据分析的执行时间大幅缩短,从而高效支持决策分析。
在开发阶段优化SQL查询代码,避免因性能问题导致的额外返工和效率损失,提升开发迭代速度。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
半价获取高级提示词-优惠即将到期