首页/数据/NoSQL 速查/PREWHERE 提前过滤
本包目录(322 条)
MongoDB99 条Elasticsearch89 条
ClickHouse56 条
时序与列式28 条选型与架构50 条

PREWHERE 提前过滤

PREWHERE 先只读取过滤条件涉及的列,筛掉大部分数据后再读其他列,显著减少 IO;优化器对部分简单条件会自动上移,也可以手动指定。

NoSQL 速查数据更新于 2026-10-12
写法SELECT … PREWHERE cond WHERE cond2
优化开关optimize_move_to_prewhere 默认开启,自动把适合的条件搬到 PREWHERE
限制PREWHERE 只能引用表中的列,不能引用 SELECT 中定义的别名或聚合结果

示例

示例
SELECT event_time, user_id, props
FROM events
PREWHERE event_type = 'click' AND event_date = today()
WHERE user_id > 0
LIMIT 100;

-- 查看执行计划,确认过滤是否前置
EXPLAIN indexes = 1
SELECT count() FROM events PREWHERE event_type = 'click';
条件本身的高选择性最重要:先裁掉大比例数据,再读宽列,IO 才能明显下降。

易错点

  • 把宽列相关的过滤写在 WHERE 而低效条件写在 PREWHERE,反而增加读取量,选择顺序要按选择性判断
  • PREWHERE 里引用 SELECT 别名会直接报错,语句需要重写

数据来源与参考

  • ClickHouse Docs: PREWHERE clause
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌