×
¥
查看详情
🔥 会员专享 文生代码 工具

SQL查询优化

👁️ 475 次查看
📅 Nov 24, 2025
💡 核心价值: 本提示词可针对指定数据库类型优化SQL语句,并提供详细优化思路和原因解释,帮助开发者提升查询性能,降低资源消耗,适用于全栈开发和数据库性能调优场景。

🎯 可自定义参数(4个)

数据库类型
适配数据库特定语法和优化策略
待优化SQL语句
输入待优化的查询语句
数据库模式描述
说明表结构、索引、关系等信息,用于执行计划分析
优化重点
指导优化方向

🎨 效果示例

下面是一套从“语句重写 + 索引/结构优化 + 执行计划控制”三个层面给出的优化方案,以及原因说明。先给出改写后的查询,再逐项解释。

一、推荐查询重写(保持结果一致,消除非SARGable、尽量提前过滤)

  • 版本A:最小改动版(把时间条件改为可走索引;去掉LOWER) SELECT c.region, DATE(o.created_at) AS order_day, SUM(oi.quantity * oi.unit_price) AS revenue FROM orders o JOIN order_items oi ON oi.order_id = o.id JOIN customers c ON c.id = o.customer_id WHERE o.created_at >= CURRENT_DATE - INTERVAL 30 DAY AND o.created_at < CURRENT_DATE + INTERVAL 1 DAY AND o.status IN ('PAID','SHIPPED') AND c.region LIKE '%east%' COLLATE utf8mb4_0900_ai_ci GROUP BY c.region, DATE(o.created_at) ORDER BY revenue DESC;

说明:

  • 用时间范围替代 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;

说明:

  • 把“数量 × 单价”的汇总从“按明细每行参与”改为“先按订单一级汇总(order_id)”,再按 region+day 做二次聚合。这样最终的 GROUP BY 只面对“订单数”,而不是“明细行数”,在你给出的规模下会明显降低分组和排序成本。
  • 配合覆盖索引可让 item_sum 仅用索引完成汇总,尽量减少回表。

二、索引与结构调整建议(让执行计划更好地利用索引,并尽量覆盖)

  • orders(过滤维度:status + created_at,连接所需:id、customer_id) 建议新增复合索引,使过滤与连接列在同一个索引里,尽量覆盖: CREATE INDEX IDX_orders_status_created_customer_id_id ON orders (status, created_at, customer_id, id);

    原理:

    • WHERE 有 status IN + created_at 范围扫描,复合索引首列放 status,次列放 created_at 有利于先按状态分段再按时间范围扫描。
    • 连接需要拿到 id(连接到 order_items)和 customer_id(连接到 customers),把它们也放进复合索引中,能减少回表次数。
    • 注意 MySQL 没有“包含列”概念,必须把需要的列都放进索引键里。
  • order_items(汇总维度:order_id;计算列:quantity、unit_price) 为了让 item_sum 能“索引覆盖 + 尽量不回表”,增加如下索引: CREATE INDEX IDX_oi_order_qty_price ON order_items (order_id, quantity, unit_price);

    原理:

    • GROUP BY order_id + SUM(quantity * unit_price) 若索引里已包含 quantity 与 unit_price,InnoDB 可以只读二级索引叶子完成汇总,避免大量回表 I/O。
    • 该索引会比单列索引更大,但你的场景是高频按 order_id 聚合,收益通常显著。
  • customers(region 过滤)

    • 如果业务允许把模糊匹配改成前缀匹配(如 'east%'),现有 IDX_customers_region(region) 就能发挥作用(范围检索可走索引)。这将是对 region 条件最有效的优化。
    • 若必须保留 '%east%' 的“任意位置匹配”,B-Tree 索引无法利用;去掉 LOWER 至少避免函数阻断索引使用的可能,但前导通配符仍不可用索引。这时可以考虑:
      1. 业务层规范化 region(枚举或前缀),改为等值或前缀匹配;
      2. 使用全文索引(FULLTEXT)和 MATCH...AGAINST('east*' IN BOOLEAN MODE),但要注意全文检索是按“词”匹配,“northeast”并不会匹配 'east*'(词边界问题),与期望不一定一致;
      3. 建立搜索专用表或外部搜索引擎(如 ngram/trigram),对“任意子串”匹配更合适。

三、执行计划与操作细节

  • 关键的 SARGable 改动

    • 把 WHERE DATE(o.created_at) ... 改成 created_at 的时间范围,使 IDX_orders_created 或复合索引中的 created_at 部分可以进行范围扫描。这样对 8M orders 只需扫描约 50 万近30天行,避免全表扫描。
    • 去掉 LOWER(region),避免函数阻断索引使用的可能路径(尽管 '%east%' 仍不能走索引)。
  • 连接与分组策略

    • 从 orders 先过滤再连 order_items(版本B/C)能显著减少 order_items 的参与数据量,优化器更容易选择 “驱动表 = filtered orders” 的连接顺序。
    • 先对 order_items 按订单做小计(版本C)可以把最终 GROUP BY 的输入规模从“明细行数(~数百万)”降至“订单数(~50万)”,从而减轻临时表、排序和内存压力。
  • 排序成本与返回量

    • ORDER BY revenue DESC 在聚合之后执行。如果结果集(region × day)不大,排序代价可控;若仅需要前 N 条,强烈建议追加 LIMIT N,MySQL 会采用更高效的 Top-N 排序算法。示例:... ORDER BY revenue DESC LIMIT 100;
    • 如果确实需要全量排序,确保 sort_buffer_size 合理(但这通常由实例级配置管理,不建议在 SQL 中频繁用 SET_VAR hint)。

四、可选的结构性优化(视业务接受度)

  • 分区(orders 按时间范围查询频繁)

    • 用 RANGE(TO_DAYS(created_at))或按月分区(如 BY RANGE (YEAR(created_at)*100 + MONTH(created_at)))。示例(按月): ALTER TABLE orders PARTITION BY RANGE (YEAR(created_at)*100 + MONTH(created_at)) ( PARTITION p202501 VALUES LESS THAN (202502), PARTITION pmax VALUES LESS THAN MAXVALUE );
    • 好处:对“最近30天”的查询只扫描近月(或当期)的分区,减少不相关数据读入。谨慎规划分区维护策略。
  • 生成列优化分组(可选)

    • 如果“按天分组”非常高频,可考虑在 orders 增加持久化生成列:order_day DATE GENERATED ALWAYS AS (DATE(created_at)) STORED,并视情况建索引(如与 status 组成复合索引)。这能让 GROUP BY 使用列而非表达式,并在某些场景下配合覆盖索引减少回表。但在本查询中,过滤依然按 created_at 范围,收益有限,属于“可选”。

五、预期 EXPLAIN 变化(理想情况)

  • 版本B/C:
    • filtered_orders:使用 IDX_orders_status_created_customer_id_id 做 range scan(key=该复合索引,rows≈500k)。
    • order_items:通过 IDX_oi_order 或 IDX_oi_order_qty_price 进行 ref 连接(key_len=4/8),仅访问与 filtered_orders 相符的 order_id;版本C中 item_sum 的聚合可以只读覆盖索引,减少回表。
    • customers:通过主键(id)做 eq_ref 连接,region 条件在行级过滤(无法用索引,但只对已匹配订单对应的客户进行过滤)。

六、结论与权衡

  • 最高性价比的改动是:把日期过滤改为可走索引的范围条件;先过滤 orders 再连 items;为 order_items 增加覆盖索引并改用“先按订单汇总”的模式。
  • LIKE '%east%' 天生很难利用 B-Tree 索引;若业务能改为标准化编码或前缀匹配,可显著提升过滤效率,否则就让它在已过滤的小集合上做行级过滤,影响可控。
  • 如果还需进一步降低排序/聚合代价,考虑增加 LIMIT 或构建周期性汇总表(按 day×region 预聚合),查询直接走汇总表。

如需,我可以基于你的 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相比的关键点

  • 去掉了WITH CTE分段:在PG12+中CTE通常会被内联,但在存在复杂成本估计或低版本时可能物化。改成子查询/内联能让优化器做并行、谓词下推与更优连接顺序。
  • JSONB过滤改为attrs @> '{"season":"winter"}':现有的GIN_products_attrs (jsonb_ops)对@>非常友好;原来的attrs->>'season' = 'winter'通常不能直接命中该GIN(除非额外有函数索引)。
  • 将产品筛选提到JOIN子查询中:帮助优化器优先使用较小的“活跃+冬季”产品集驱动连接,再借助sales(product_id, sold_at)索引做回表,显著降低sales的扫描量。

二、索引优化建议(按收益从高到低)

  1. 覆盖式索引:sales(product_id, sold_at) INCLUDE (qty, amount)
  • 语句: CREATE INDEX CONCURRENTLY idx_sales_prod_time_cover ON sales (product_id, sold_at) INCLUDE (qty, amount);
  • 原因与效果:
    • 你已有(product_id, sold_at)索引,但聚合还需要qty/amount;INCLUDE可以显著增加“索引仅扫描”的概率(可减少大量Heap访问与随机I/O),尤其在90天窗口内数据经常被VACUUM标记为all-visible时收益明显。
    • 该索引完全匹配“按product_id定位后按时间过滤”的访问模式,并支撑聚合所需列。
  1. 产品侧“活跃+冬季”部分覆盖索引(减少回表,提升Join与取category_id成本)
  • 语句(PG11+,利用INCLUDE): CREATE INDEX CONCURRENTLY idx_products_active_winter_id_cat ON products (id) INCLUDE (category_id) WHERE status = 'active' AND (attrs->>'season') = 'winter';
  • 原因与效果:
    • 连接键是p.id,聚合要用p.category_id。该“部分覆盖索引”使连接获取category_id时无需回表(Index Only Scan),且仅覆盖到真正需要的子集(active+winter),I/O大幅下降。
    • 比“(category_id, id)”更对口,因为Join按id等值匹配。
  1. 让JSONB过滤稳定命中索引的两种选择(二选一)
  • 如果你更倾向写attrs->>'season' = 'winter': CREATE INDEX CONCURRENTLY idx_products_season_expr ON products ((attrs->>'season')); 并配合WHERE status='active'多用: CREATE INDEX CONCURRENTLY idx_products_active_season_expr ON products ((attrs->>'season')) WHERE status='active';
  • 如果更偏向@>(推荐,已在SQL改用@>): 现有GIN(jsonb_ops)可用;若“季节”字段查询非常高频,也可做一个“活跃”部分GIN: CREATE INDEX CONCURRENTLY gin_products_attrs_active ON products USING GIN (attrs jsonb_path_ops) WHERE status='active'; 注:jsonb_path_ops对@>更紧凑,内存和匹配效率更好,但功能略窄;jsonb_ops已足够则不必新增。

三、执行计划预期与验证要点

  1. 期望的计划轮廓
  • 先扫描小集合的products(Bitmap/Index Scan)得到active+winter的id与category_id;
  • Hash/Bitmap/Nested Loop Join到sales:
    • 若驱动为products,访问sales时走 idx_sales_prod_time_cover(product_id, sold_at) 做索引范围扫描(sold_at >= now() - 90d);
    • 对sales侧触发并行扫描与并行聚合(Parallel HashAggregate)。
  • HashAggregate按(category_id, product_id)汇总;
  • Window(ROW_NUMBER)在聚合结果上做分区排序,结果集量级已被大幅收缩;
  • 外层过滤rn <= 10,再排序输出(小结果,代价很低)。
  1. 用EXPLAIN (ANALYZE, BUFFERS) 验证
  • 关注点:
    • 没有“CTE Scan”/“Materialize”导致的大量I/O;
    • products使用索引(Bitmap/Index Scan)且行数估计接近;
    • sales侧使用 idx_sales_prod_time_cover,堆块(Hits)较少、索引块(Hits)为主;
    • HashAggregate/Sort 没有发生磁盘溢出(注意Sort Method: external/ spilled);
    • 并行度(Workers Planned/Launched)> 0。

四、运行参数与统计建议

  • work_mem:窗口排序与分组建议每个worker至少64–128MB(根据并发适当权衡)。若EXPLAIN显示溢出到磁盘,增大到不溢出为宜。
  • max_parallel_workers_per_gather:2–4(视硬件与并发),确保并行聚合能生效。
  • effective_cache_size:按机器内存合理设置(如内存的50–75%),帮助成本估计器更激进地使用索引。
  • 针对表达式的统计(帮助选择合适计划,尤其是JSONB键与status的联合选择度) CREATE STATISTICS stats_products_season_status (mcv) ON (attrs->>'season'), status FROM products; ANALYZE products;
  • 定期ANALYZE sales, products;大型表设置更高统计目标: ALTER TABLE products ALTER COLUMN attrs SET STATISTICS 1000;

五、进一步的结构性优化(若该查询高频)

  • 预聚合/物化明细
    • 建每日级别的增量汇总表 sales_agg_daily(product_id, day, qty_sum, amount_sum),查询聚合只需汇总近90天的<=90行/产品,大幅降低CPU与I/O;
    • 可用触发器/定时任务或流式ETL增量维护。
  • 分区
    • sales按月份/天范围分区;谓词s.sold_at >= now()-90d会触发分区裁剪,只扫描近3个月分区。现有索引在每个分区建立小一些即可。
  • 模型调整
    • 若season查询极其高频,可将season升维为显式列并建常规BTREE/部分索引,避免JSONB解析与GIN代价。

六、为什么这些优化有效(对应你的关切点)

  • 执行计划:去掉CTE屏障、把产品筛选内联,给优化器更大自由度选择“先小后大”的连接顺序与并行聚合;使用@>让GIN生效。
  • 资源消耗:覆盖索引减少大量Heap访问;部分索引将扫描范围缩到“活跃+冬季”;并行聚合降低单核CPU与内存压力。
  • 查询效率:驱动小集合、索引范围扫描、减少排序/窗口输入规模;避免CTE物化的中间大结果集读写。
  • 索引使用:将谓词改写为@>命中现有GIN;为连接与聚合补齐覆盖列,最大化索引仅扫描;必要时加表达式/部分索引以提升选择性。

七、落地执行顺序(建议)

  1. 先改SQL为上面的版本并EXPLAIN (ANALYZE, BUFFERS) 验证计划形态;
  2. 创建 idx_sales_prod_time_cover 索引;ANALYZE sales;
  3. 如仍有明显Heap访问或CPU瓶颈,再创建 idx_products_active_winter_id_cat(或选择表达式/部分GIN方案之一);ANALYZE products;
  4. 调整work_mem与并行参数,消除聚合/排序磁盘溢出;
  5. 若该查询高频,再评估日级物化/分区方案。

如你能提供EXPLAIN (ANALYZE, BUFFERS) 的实际输出,我可以进一步对节点与行数估计偏差、是否并行、是否溢出等进行针对性微调。

下面给出可落地的改造方案与原因说明,目标是让查询在“最近7天的Tasks”上高效聚合,并让用户邮箱筛选可走索引,降低排序与内存授予成本。

一、核心问题与思路

  • 标量UDF dbo.NormalizeEmail(u.Email) 让谓词不可SARG(无法索引查找),且在SQL Server中常导致每行调用、CPU高、阻碍并行与优化器估算。
  • LIKE '%@example.com' 是后缀匹配,前缀通配符使现有 Users.Email 索引无法被Seek,只能Scan。
  • 时间范围筛选可利用“CreatedAt为前导列”的复合覆盖索引(或分区),让引擎只读最近7天数据。
  • 将任务先按用户聚合,再TOP/ORDER,能显著减少后续连接和排序的数据量。

二、推荐的模式与索引改造

  1. 为邮箱后缀查询做可SARG的列与索引
  • 新增持久化计算列 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 = 'example.com',从根本上消除前缀通配符问题,使谓词可走索引Seek。
  • 使用 LOWER 确保域名大小写一致性。该表达式是确定性且可持久化并可索引。

备选方案(若不能改造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。

  1. 为时间范围聚合建立覆盖索引(以时间为前导)
  • 现有 IX_Tasks_Assigned_Created(AssignedTo, CreatedAt INCLUDE(DurationMinutes)) 在仅按时间筛选时不理想,因为 CreatedAt不是前导列。
  • 新增覆盖索引,让“最近7天”可Seek并覆盖聚合: CREATE INDEX IX_Tasks_Created_Assigned_Incl ON dbo.Tasks (CreatedAt, AssignedTo) INCLUDE (DurationMinutes);

说明:

  • 以 CreatedAt 为前导,可以直接Seek到“最近7天”的2M行左右,而不是在120M上扫描。
  • INCLUDE DurationMinutes 保证聚合无需回表。
  • 与 GROUP BY AssignedTo 配合良好:先按时间裁剪,再聚合到用户。

可选:如果已有分区(按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); -- 让优化器以当前常量选择更优计划(尤其当选择性很高)

说明:

  • 去掉标量UDF,避免阻断优化器。
  • 半开时间区间避免“BETWEEN”边界包含/遗漏的潜在问题,通常对估算更友好。
  • 先在Tasks上时间裁剪并聚合,大幅减少后续Join和排序数据量。
  • OPTION(RECOMPILE)让优化器基于“example.com”和具体7天范围的实时基数估算选择更优的索引与并行度(在无参数化场景下通常收益明显)。如对CPU敏感,可视情况移除。

四、执行计划期望变化

  • Users侧:由全表/索引扫描转为在 IX_Users_EmailDomain(或过滤索引)上Seek,返回极少量用户行。
  • Tasks侧:在 IX_Tasks_Created_Assigned_Incl 上对最近7天做范围Seek,只读约2M行,并因覆盖索引避免Key Lookup;随后本地聚合(Hash/Aggregate或Stream Aggregate,取决于统计与排序)。
  • 排序与TOP:对聚合后行集做Top-N Sort,内存授予显著下降;并行更容易介入,整体查询时间显著缩短。

五、维护与可维护性建议

  • 统计信息:对新建索引(Users.EmailDomain、Tasks.CreatedAt,AssignedTo)启用自动统计更新,并在大量数据变更后考虑手动更新统计(必要时FULLSCAN)以保证范围估算准确。
  • 写入路径:新增持久化计算列对写入影响极小(每次写入一次计算),通常远小于查询收益;如Email更新频率低,其开销可忽略。
  • 如果必须继续用NormalizeEmail的逻辑(例如复杂邮箱规范化):尽量将其转为“可内联的表值函数(inline TVF)”或在写入时完成规范化并存储到列中。SQL Server 2019的标量UDF内联需满足严格限制,且即便内联,前缀通配符问题仍在,因此更推荐存列+索引的方式。
  • 并行与内存:在压力较大系统中,可根据观察添加 MAXDOP 或使用资源治理;但在多数场景下让优化器自由选择并行对该类查询更优。

六、如果不改造Schema的临时折中

  • 继续使用 LIKE '%@example.com' 时,可建立过滤索引: CREATE INDEX FI_Users_Email_example ON dbo.Users(Email) INCLUDE (UserId) WHERE Email LIKE N'%@example.com'; 这会显著缩小扫描范围,但本质仍是扫描(非Seek);性能提升有限,推荐度低于 EmailDomain 方案或 EmailReversed 方案。

总结

  • 去UDF、消除前缀通配符,通过“EmailDomain 等值匹配 + CreatedAt前导覆盖索引 + 先聚合再连接”的组合,能最大化利用索引与统计,显著提升查询效率,同时保持可维护性与稳定的执行计划。

示例详情

该提示词已被收录:
“工具化助手必备:高效AI应用全指南”
覆盖文档、代码到流程优化,提升工作效率
√ 立即可用 · 零学习成本
√ 参数化批量生成
√ 专业提示词工程师打磨

📖 如何使用

30秒出活:复制 → 粘贴 → 搞定
与其花几十分钟和AI聊天、试错,不如直接复制这些经过千人验证的模板,修改几个 {{变量}} 就能立刻获得专业级输出。省下来的时间,足够你轻松享受两杯咖啡!
加载中...
💬 不会填参数?让 AI 反过来问你
不确定变量该填什么?一键转为对话模式,AI 会像资深顾问一样逐步引导你,问几个问题就能自动生成完美匹配你需求的定制结果。零门槛,开口就行。
转为对话模式
🚀 告别复制粘贴,Chat 里直接调用
无需切换,输入 / 唤醒 8000+ 专家级提示词。 插件将全站提示词库深度集成于 Chat 输入框。基于当前对话语境,系统智能推荐最契合的 Prompt 并自动完成参数化,让海量资源触手可及,从此彻底告别"手动搬运"。
即将推出
🔌 接口一调,提示词自己会进化
手动跑一次还行,跑一百次呢?通过 API 接口动态注入变量,接入批量评价引擎,让程序自动迭代出更高质量的提示词方案。Prompt 会自己进化,你只管收结果。
发布 API
🤖 一键变成你的专属 Agent 应用
不想每次都配参数?把这条提示词直接发布成独立 Agent,内嵌图片生成、参数优化等工具,分享链接就能用。给团队或客户一个"开箱即用"的完整方案。
创建 Agent

✅ 特性总结

智能优化SQL查询语句,针对不同数据库类型轻松生成最优执行版本。
精准分析数据库模式和结构,深度理解用户提交的需求与上下文。
优化过程透明化,提供清晰的优化思路和理由,助力用户理解背后逻辑。
支持自定义优化目标,如提升查询速度、降低资源消耗、避免锁表等诉求。
高效生成专业级别的SQL解决方案,为复杂数据库任务节省大量时间。
灵活适配多种数据库架构,满足企业多样化场景需求。
自动校验语句可用性,规避潜在执行风险,确保语句安全性和稳定性。
无缝支持开发、运维、数据分析等多岗位场景,提升全团队协作效率。

🎯 解决的问题

帮助用户快速优化特定数据库类型的SQL查询语句,提高查询效率,并通过详细的优化思路讲解,增强用户的SQL性能调优能力。

🕒 版本历史

当前版本
v2.1 2024-01-15
优化输出结构,增强情节连贯性
  • ✨ 新增章节节奏控制参数
  • 🔧 优化人物关系描述逻辑
  • 📝 改进主题深化引导语
  • 🎯 增强情节转折点设计
v2.0 2023-12-20
重构提示词架构,提升生成质量
  • 🚀 全新的提示词结构设计
  • 📊 增加输出格式化选项
  • 💡 优化角色塑造引导
v1.5 2023-11-10
修复已知问题,提升稳定性
  • 🐛 修复长文本处理bug
  • ⚡ 提升响应速度
v1.0 2023-10-01
首次发布
  • 🎉 初始版本上线
COMING SOON
版本历史追踪,即将启航
记录每一次提示词的进化与升级,敬请期待。

💬 用户评价

4.8
⭐⭐⭐⭐⭐
基于 28 条评价
5星
85%
4星
12%
3星
3%
👤
电商运营 - 张先生
⭐⭐⭐⭐⭐ 2025-01-15
双十一用这个提示词生成了20多张海报,效果非常好!点击率提升了35%,节省了大量设计时间。参数调整很灵活,能快速适配不同节日。
效果好 节省时间
👤
品牌设计师 - 李女士
⭐⭐⭐⭐⭐ 2025-01-10
作为设计师,这个提示词帮我快速生成创意方向,大大提升了工作效率。生成的海报氛围感很强,稍作调整就能直接使用。
创意好 专业
COMING SOON
用户评价与反馈系统,即将上线
倾听真实反馈,在这里留下您的使用心得,敬请期待。
加载中...