问这个问题,特别是针对 Postgres,因为它对 R 树/空间索引有很好的支持。
我们有下表,其中包含单词及其频率的树结构(嵌套集模型):
lexikon
-------
_id integer PRIMARY KEY
word text
frequency integer
lset integer UNIQUE KEY
rset integer UNIQUE KEY
Run Code Online (Sandbox Code Playgroud)
和查询:
SELECT word
FROM lexikon
WHERE lset BETWEEN @Low AND @High
ORDER BY frequency DESC
LIMIT @N
Run Code Online (Sandbox Code Playgroud)
我认为覆盖索引(lset, frequency, word)
会很有用,但我觉得如果范围内的lset
值太多,它可能表现不佳(@High, @Low)
。
(frequency DESC)
有时,当使用该索引的搜索早期产生@N
与范围条件匹配的行时,一个简单的索引也可能就足够了。
但似乎性能在很大程度上取决于参数值。
有没有办法让它快速执行,不管范围(@Low, @High)
是宽还是窄,也不管高频词是否幸运地在(窄)选择的范围内?
R-tree/空间索引有帮助吗?
添加索引,重写查询,重新设计表,没有限制。
postgresql performance index database-design query-performance
我有一个使用 sqlite3 作为数据库的小网络应用程序(数据库相当小)。
现在,我正在使用以下查询生成一些要显示的内容:
SELECT dbId,
dlState,
retreivalTime,
seriesName,
<snip irrelevant columns>
FROM DataItems
GROUP BY seriesName
ORDER BY retreivalTime DESC
LIMIT ?
OFFSET ?;
Run Code Online (Sandbox Code Playgroud)
其中limit
通常为 ~200,并且offset
为 0(它们驱动分页机制)。
无论如何,现在,这个查询完全扼杀了我的表现。在具有约 67K 行的表上执行大约需要 800 毫秒。
我在seriesName
和上都有索引retreivalTime
。
sqlite> SELECT name FROM sqlite_master WHERE type='index' ORDER BY name;
<snip irrelevant indexes>
DataItems_seriesName_index
DataItems_time_index // This is the index on retreivalTime. Yeah, it's poorly named
Run Code Online (Sandbox Code Playgroud)
但是,EXPLAIN QUERY PLAN
似乎表明它们没有被使用:
sqlite> EXPLAIN QUERY PLAN SELECT dbId,
dlState, …
Run Code Online (Sandbox Code Playgroud) 我有一个us_customers
看起来像这样的表(有数十万行):
+----------+----------+
| id | us_state |
+----------+----------+
| 12345678 | MA |
| 23456781 | AL |
| 34567812 | GA |
| 45678123 | FL |
| 56781234 | AZ |
| 67812345 | MA |
| 78123456 | CO |
| 81234567 | FL |
+----------+----------+
Run Code Online (Sandbox Code Playgroud)
...我想n
从每个us_state
.
有没有办法在 PostgreSQL 9.3 中干净利落地做到这一点?
我可以通过以下方式us_state
轻松地从每个客户那里获得一位客户:
SELECT DISTINCT ON (us_state) id
FROM us_customers
ORDER BY us_state;
Run Code Online (Sandbox Code Playgroud)
但是,如果我想要来自每个州的三个客户,有没有一种方法可以在不多次运行相同查询的情况下做到这一点?