我在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约束的搜索是我在此表上运行的唯一搜索,因此我不太关心此索引会降低其他搜索速度。
最后,我是否必须更改搜索查询以使用索引,还是在搜索表时会自动使用该索引?
答案 0 :(得分:1)
你应该考虑使用它:
CREATE INDEX searchIndex ON rawData (fileID, lineNum);
一些事情:
特别是,根据docs,Indexes 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
有多少fileID
,data1 < ?
子句的选择性,硬件是什么,我们的配置设置是什么,您正在使用的PostreSQL版本,表行的物理顺序等等。
唯一可以确定的方法是在自己的系统上使用自己的数据进行尝试,然后看看。
我只是在(fileID, lineNum, data1)
或甚至只是(fileID, lineNum)
上建立一个索引,因为这似乎更自然,然后忘了它。最有可能的是它足够快。一旦出现明显的性能问题,就会得到一个真正的结论所需的测试用例。