- 我们有一张表用来存储Events。
- 该表在其主键上有一个索引
假设我们只在该表上做简单SELECT
的 s 或INSERT
s - 随着越来越多的行被添加,检索或插入时间会明显*变慢吗?
我(非常粗略)的理解是索引使查找时间非线性(非 O(N)),因此,至少理论上,这不会成为问题——但我想确认这一点。
我们正在使用PostgreSQL 9.5.3,并且在某个时候我们希望这个表有数十亿行。
*值得注意:现在检索 5000 个事件需要 < 1 秒,值得注意的是 > 2 秒
假设我们只在该表上做简单SELECT
的 s 或INSERT
s - 随着越来越多的行被添加,检索或插入时间会明显*变慢吗?
我(非常粗略)的理解是索引使查找时间非线性(非 O(N)),因此,至少理论上,这不会成为问题——但我想确认这一点。
我们正在使用PostgreSQL 9.5.3,并且在某个时候我们希望这个表有数十亿行。
*值得注意:现在检索 5000 个事件需要 < 1 秒,值得注意的是 > 2 秒
桌子不会减速或加速,它们只是坐在那里。另一方面,语句可以放慢速度。您没有提供有关数据的足够详细信息,但是如果您的主键是单调递增的,例如时间戳或序列值,您最终会在插入时非常频繁地重新平衡树。同时,使用这样的主键,您可以在尾端创建一个并发热点,所有插入都将在这里发生。
同时,索引中的条目从 10 6增加到 10 9会使最坏情况查找的比较次数从 20 次增加到 30 次,增加了 50%,因此根据您的 PK 值大小,您完全有可能超过您的显着性阈值2 秒,表中有“数十亿”行。
表选择或插入语句的速度取决于许多因素:
所有这些都会影响您的查询。您的索引有助于提高某些语句的速度(那些可以使用索引中的数据而无需搜索整个表的语句。)索引本身并不是一件坏事。
现在,速度发生变化:在正常操作条件下,您不应该看到查询速度有明显变化。(正常 = 平均工作日,异常 = 加载或删除大量数据的日子,当在该盒子上创建另一个数据库并正在生产时,电源熄灭并且您使用电池运行。)话虽这么说,根据有多少并发用户,您在查询中有 1 秒的差异可能是正常的。
如果我怀疑数据库性能问题,以下是我寻找的内容: 1. 最近对数据库或服务器有任何更改吗?2. 正在运行的查询与正常情况有很大不同吗?具有 4 个连接的查询不如对没有连接的 1 个表的查询有效。3.最近有什么环境问题吗?例如电源,意外重启。4. 查看数据库日志并查找错误、锁定等。5. 查看服务器日志并查找错误。6.最近有网络问题吗?检查他们日志中的网络组。7. 做一个测试查询作为你的基线。您在数据库生命周期开始时运行它,记下运行时间和返回的行数。然后,当您怀疑性能不佳时,再次运行您的测试查询。您的基线是否有实质性变化?预计会有更多行和一些时间增加。非常不同的数据、查询表锁定或比上次测试运行慢 10 倍都是不寻常的。如果是这样,请调查原因。
尝试其中的部分或全部步骤,看看是否发现任何问题。