当我搜索满足某个条件的行时:
SELECT something FROM table WHERE type = 5;
在包含10K和10M行的表上执行此查询时,它是否存在线性差异?
换句话说 - 在10K桌上进行这种查询的速度比在10M桌上制作快1000倍?
我的表格中包含一列type
,其中包含1
到10
的数字。此表上最常见的查询将是上面的查询。如果性能差异为真,我将为每种类型制作10个表以获得更好的性能。如果这不是真正的问题,我将有两个表 - 一个用于types
,第二个表用于带有type_id
列的数据。
修改
有多个行type
值。
答案 0 :(得分:2)
(答案最初标记为postgresql,答案就是这些条款。其他DBMS会有所不同。)
与大多数超级广泛的问题一样,"它取决于"。
如果没有索引存在,那么时间可能大致是线性的,但几乎是固定的启动成本加上一些断点 - 例如从表格适合RAM到不再适合RAM时。各种各样的效果可以发挥作用 - 内存银行和NUMA,磁盘预读,底层磁盘子系统中的并行性,文件系统上的碎片,表中的MVCC膨胀等 - 使这个远简单。
如果有问题的属性的b树索引将以低于线性的速率增加 - probably around O(log n)
。根据索引是否适合RAM,表是否适合RAM等等而变化多少。但是,PostgreSQL通常必须为每个索引指针执行堆查找,这会随机添加I / O成本相当不可预测,具体取决于数据分发/集群,缓存和预读等。它可能能够进行仅索引扫描,在这种情况下,如果真空运行足够,则可以避免这种辅助查找。
所以...在极简化术语中,没有索引= O(n)
,索引为〜= O(log n)
。非常,非常近似。
我认为问题的根本意图是:拥有1000个1000行的表或1个1,000,000行的表是否更快?。如果是这样的话:在绝大多数情况下,单个较大的表将是性能和管理的更好选择。