【发布时间】:2009-03-10 08:57:13
【问题描述】:
假设我有一个表有 1000 行,而另一个表具有相同的结构/索引但有 1000 万条记录。大表上 CRUD 操作的性能会比小表慢吗?谢谢。
【问题讨论】:
标签: database performance
假设我有一个表有 1000 行,而另一个表具有相同的结构/索引但有 1000 万条记录。大表上 CRUD 操作的性能会比小表慢吗?谢谢。
【问题讨论】:
标签: database performance
取决于数据库引擎,但通常是的,它会更慢,只是因为您必须通过索引来查找数据。如果您进行全局更新,它也会变慢,这仅仅是因为您要更改更多数据。
数据库也经常调整为快速写入或快速读取 - 在第二种情况下,您必须更新索引,一旦索引很大,这需要更多时间。
【讨论】:
这取决于。平均而言,创建、删除和更新会稍微慢一些,因为索引结构更有可能需要重新组织。此外,如果经常从数据库系统请求更多数据,那么您尝试访问的数据不太可能缓存在 RAM 中并且必须从硬盘读取。但这些差异对于修改查询应该不是很显着。
不过,获取/读取肯定会更慢。很明显,必须获取、过滤、排序和分组大量数据比处理少量数据要慢。如果您正在处理的数据太大而无法放入机器的 RAM,则尤其如此。
【讨论】:
这取决于很多因素,几乎不可能说出来。示例:数据库引擎将数据存储为具有指向字符串的指针的行。出于某种原因,您的 10M 行表仅包含四个不同的字符串。所以你有 10M 指向四个字符串的指针。
用另一个字符串替换一个字符串实际上只会用另一个字符串替换一个字符串;指针将是相同的。也不需要更新索引。无论您有多少行,速度都一样。
除非删除只是将字符串标记为“已删除”,否则删除会更慢。一段时间后运行的清理过程实际上会清理表。但是作为数据库的用户,你不会注意到:delete 会立即返回。
Select 会更慢,因为它必须返回更多数据。返回第一行之前的时间很大程度上取决于引擎设计和您的查询。针对 10M 表且索引选择良好的编写良好的查询可能比针对具有错误索引的 1K 表的查询要快。这取决于服务器上的 RAM 量(也许它可以将整个数据库保存在 RAM 中)、磁盘速度(具有许多可以并行工作的磁盘的 RAID 阵列与具有少量 RAM 和单个磁盘的慢速 PC)。
插入通常较慢,因为您将在 10M 表上拥有更多(和更大)的索引,但如果您没有索引,向 10M 表添加单行通常与添加到小表一样快。
【讨论】:
没有索引(或顺序),插入、更新和删除在页面访问方面应该没有显着差异(不包括受SQL类型和内存缓存大小等影响很大的定位页面时间)
索引的类型和数量以及你使用的SQL产品会有明显的影响
在顺序键上只有一个整数索引的 10M 行表对于 1000 行和 10M 行的执行非常相似,因为每次插入或删除只会更改一个索引页(99.9% 的时间使用全页索引),并且更新不会有索引更改。 10M 行的索引页将适合大多数服务器的缓存
但是 varchar(50) 属性上的索引与 1000 行相比,10M 行可能会慢很多倍,但这是大型索引的成本
不过,1000 万行并不需要太多担心。如果您的行长度为 100 字节,那么整个表将适合
如果您担心性能,添加更多 RAM,这比尝试手动优化数据库便宜
【讨论】:
当然可以,但我不确定在没有任何上下文的情况下这是非常有用的信息。出于应用程序设计的目的,它通常是您最不关心的问题之一,因为有很多方法可以处理它,而且通常没有很多具有成本效益的替代方案。
你为什么这么问?
【讨论】: