为我的数据库创建最佳索引

时间:2016-03-01 16:02:22

标签: postgresql

我在postgresql中有一个表,其中包含以下信息:

rawData (fileID integer references otherTable, lineNum integer, data1 double, ...)

当我搜索此表时,我使用以下查询执行此操作:

SELECT lineNum, data1, ...other data FROM rawData WHERE 
fileID = ? AND data1 < ? ORDER BY lineNum;

通常,此表中的数据是每个fileID的条目数,每个fileID都有0到x的lineNum,而lineNum从不为每个fileID重复(但它对不同的fileID重复)。那么data1实际上是一个可能重叠或不重叠的随机数。

为了加快读取这些数据,我试图在其上创建一个索引,但是我很难找到索引它的最佳方法。目前我正在研究以下两种索引方法之一,并且我想知道哪种方法对我的搜索更好,或者如果有其他选项我没有想到会比其中任何一种更好。

指数创意1:

CREATE INDEX searchIndex ON rawData (fileID, data1, lineNum);

索引理念2:

CREATE INDEX searchIndex ON rawData (fileID, lineNum, data1);

请注意,此时此操作和不受data1约束的搜索是我在此表上运行的唯一搜索,因此我不太关心此索引会降低其他搜索速度。

最后,我是否必须更改搜索查询以使用索引,还是在搜索表时会自动使用该索引?

2 个答案:

答案 0 :(得分:1)

你应该考虑使用它:

CREATE INDEX searchIndex ON rawData (fileID, lineNum);

一些事情:

  • 特别是,根据docsIndexes with more than three columns are unlikely to be helpful unless the usage of the table is extremely stylized

  • 由于您的第二个搜索查询需要在没有data1列的情况下进行过滤,因此保留第二列lineNum应该足够了(因为您提到它将是准随机的),并且在罕见的情况下发生重复,表取物应确保正确。但这意味着指数的大小将 1/3 ,这是一个巨大的胜利(Think index足够小,足以在内存/仅索引扫描等)< / p>

答案 1 :(得分:0)

可以使用任何一个索引。哪个更快将取决于许多事情,例如表中有多少行,每lineNum有多少fileIDdata1 < ?子句的选择性,硬件是什么,我们的配置设置是什么,您正在使用的PostreSQL版本,表行的物理顺序等等。

唯一可以确定的方法是在自己的系统上使用自己的数据进行尝试,然后看看。

我只是在(fileID, lineNum, data1)或甚至只是(fileID, lineNum)上建立一个索引,因为这似乎更自然,然后忘了它。最有可能的是它足够快。一旦出现明显的性能问题,就会得到一个真正的结论所需的测试用例。