2016-03-01 58 views
0

我有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); 

注意的是,此时,这和搜索不是由数据1约束是我在这个表上运行的唯一搜索,所以我并不太在意这个指数减缓其他搜索。

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

回答

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应该是足够了(因为你提到这将是准随机),并在罕见的情况,有重复,表取应确保正确性。但是,这将意味着是该指数将在规模,这是一个巨大的胜利(想想指数小,足以在内存/仅索引扫描图等)

0
1/3

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

唯一可以肯定的方法是在自己的系统上使用自己的数据进行试验并查看。

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

相关问题