这是一个困扰我一段时间的概念性问题,但是我还没有找到一个好的解决方案(我不是数据库忍者):
我需要在表中找到特定行,该行在XML列中存储了标识符(以及其他内容)。这是由第三方组件完成的,我无法更改。该表很大,因此解析所有这些XML以查找标识符非常慢(我正在使用Postgres的内置XML解析器)。但是我知道我要搜索的行是插入的最后几行。
之一。有没有合理的方法来加快查询速度?
(我确实有一个时间戳列,但我怀疑对条目进行排序实际上会加快我的查询速度。)
编辑:
数据库表:
XML示例(已缩短)
<message id="my_unique_identifier" to="user@chat_server" type="groupchat" from="chat_room@chat_server">
<body>Hello World!</body>
</message>
到目前为止,我的基本查询(只执行xpath查找)
SELECT messages.*
FROM messages
WHERE ((xpath('/message/@id', stanza::XML))[1]::TEXT = 'my_unique_identifier')
LIMIT 1
如果您正在寻找一行并且在(timestamp)
上有一个索引,那么以下内容可能会更快:
select t.*
from t
where . . .
order by timestamp desc
limit 1;
由于order by
,Postgres可能会选择按索引顺序扫描数据。但是,不能保证,Postgres仍然可以决定先进行所有解析,然后再进行所有排序。
您可能找到对您正在做的事情有用的全文索引。