如何测试列顺序在 PostgreSQL 中建立索引的重要性?
How can I test the importance of column order in indexing in PostgreSQL?
我正在阅读 Markus Winand 的幻灯片:https://www.slideshare.net/MarkusWinand/indexes-neglectedperformanceallrounder
我通过以下步骤对此进行了测试:
- 用 column_1 整数和 column_2 整数创建一个 table
- 运行 下面的命令:
INSERT INTO dev.table_name(column_1, column_2)
SELECT RANDOM() * 10, RANDOM() * 10 FROM generate_series(1, 10000);
create index idx on dev.table_name(column_1, column_2);
explain (buffers, analyze, verbose) select * from dev.table_name where column_2=2;
explain (buffers, analyze, verbose) select * from dev.table_name where column_1=2;
explain (buffers, analyze, verbose) select * from dev.table_name where column_1=2 and column_2= 2;
但是,查询 column_1 和 column_2 使用仅索引扫描而不是 column_1 使用索引和 column_2 使用顺序扫描,正如幻灯片中预期的那样
我的问题是如何测试列顺序的重要性?这是否不起作用,因为我使用整数列?我尝试使用 sync && sudo purge
和 discard all
删除缓存,但它仍然是一样的。
索引是大海捞针的好帮手。他们在针垫中找针的能力并没有那么出色。
你应该让条件更有选择性,同时让table更大。
INSERT INTO dev.table_name(column_1, column_2)
SELECT RANDOM() * 1000, RANDOM() * 1000 FROM generate_series(1, 1000000);
我正在阅读 Markus Winand 的幻灯片:https://www.slideshare.net/MarkusWinand/indexes-neglectedperformanceallrounder
- 用 column_1 整数和 column_2 整数创建一个 table
- 运行 下面的命令:
INSERT INTO dev.table_name(column_1, column_2)
SELECT RANDOM() * 10, RANDOM() * 10 FROM generate_series(1, 10000);
create index idx on dev.table_name(column_1, column_2);
explain (buffers, analyze, verbose) select * from dev.table_name where column_2=2;
explain (buffers, analyze, verbose) select * from dev.table_name where column_1=2;
explain (buffers, analyze, verbose) select * from dev.table_name where column_1=2 and column_2= 2;
但是,查询 column_1 和 column_2 使用仅索引扫描而不是 column_1 使用索引和 column_2 使用顺序扫描,正如幻灯片中预期的那样
我的问题是如何测试列顺序的重要性?这是否不起作用,因为我使用整数列?我尝试使用 sync && sudo purge
和 discard all
删除缓存,但它仍然是一样的。
索引是大海捞针的好帮手。他们在针垫中找针的能力并没有那么出色。
你应该让条件更有选择性,同时让table更大。
INSERT INTO dev.table_name(column_1, column_2)
SELECT RANDOM() * 1000, RANDOM() * 1000 FROM generate_series(1, 1000000);