主キーの確認
テーブルの作成
toUnixTimestamp(timestamp) が含まれている点に注目してください。
データを投入する
基本的なフィルタリング
codeでフィルタすると、出力にスキャンされた行数 (49.15 thousand) が表示されます。これは、合計1億行の一部にすぎないことがわかります。
EXPLAIN indexes=1 句を使って、索引が使用されていることを確認できます:
8012 が、合計 12209 の一部にすぎないことに注目してください。以下でハイライトされているセクションは、主キーが使用されていることを示しています。
ソートキーの後ろのキーでフィルタリングしても、タプル内でそれより前にあるキーでフィルタリングする場合ほど効率的ではありません。その理由については、こちらを参照してください
複数キーでのフィルタリング
code と timestamp を条件にフィルタリングするとします:
87 個のみです。
ソートでキーを使用する
EXPLAIN pipeline を使って、この最適化が適用されていないことを確認できます。
MergeTreeSelect(pool: ReadPool, algorithm: Thread) という行は、この最適化が使われていることを示すものではなく、通常の読み取りであることを示しています。これは、テーブルのソートキーに timestamp ではなく toUnixTimestamp(Timestamp) を使っているためです。 この不一致を修正すれば、問題は解消されます。