ORDER BY 键,以及使用 materialized view。
我们将看到,这些方法如何将查询时间从秒级缩短到毫秒级。
优化 ORDER BY 键
project 和 subproject 列进行过滤。
在这种情况下,最好将它们加入排序键中——还要加上 time 列,因为我们也会按时间查询。
下面我们创建该表的另一个版本,它与 wikistat 具有相同的列类型,但按 (project, subproject, time) 排序。
| 查询 | (time) | (project, subproject, time) |
|---|---|---|
| 2.381 秒 | 1.660 秒 | |
| 2.148 秒 | 0.058 秒 | |
| 2.192 秒 | 0.012 秒 | |
| 2.968 秒 | 0.010 秒 |
Materialized views
创建 materialized view
回填目标表
wikistat 表插入新记录时才会填充,因此我们需要进行一些回填。
最简单的方法是使用 INSERT INTO SELECT 语句,利用该视图的 SELECT 查询 (转换逻辑) ,直接向 materialized view 的目标表插入数据:
- 创建一个使用 Null 表引擎的临时表
- 将平时使用的 materialized view 的一个副本连接到这个临时表
- 使用
INSERT INTO SELECT查询,将原始数据集中的所有数据复制到该临时表 - 删除该临时表和临时 materialized view。
wikistat_backfill 读取的数据写入 wikistat_top
wikistat 表中的数据填充 wikistat_backfill: