【问题标题】:Does the number of records have any impact on performance记录数对性能有影响吗
【发布时间】:2013-11-16 22:17:36
【问题描述】:

数据库中的记录数会影响选择查询的速度吗?

我的意思是,如果一个数据库有 50 条记录,而另一个数据库有 500 万条记录,那么第二个数据库的选择会更慢吗?假设我的所有索引都在正确的位置

【问题讨论】:

    标签: database performance sqlite


    【解决方案1】:

    可以,但不一定是大罚。

    在最基本的级别上,索引是 b 树。性能在某种程度上与 b-tree 中的级别数相关,因此 5 条记录的数据库大约有 2 级,500 万条记录的数据库大约有 22 级。但它是二进制的,所以一个 1000 万行的数据库有 23 个级别,实际上,索引访问时间通常不是性能调优的问题——通常的问题是没有正确索引的表。

    正如 odedsh 所说,缓存也是一个很大的贡献者,小型数据库将得到很好的缓存。 Sqlite 以主键顺序存储记录,因此选择一个允许一起存储常用记录的主键可能是一个很大的好处。

    【讨论】:

      【解决方案2】:

      是的,因为其他人所说的原因,这很重要。

      还有其他因素会影响 Select 语句的速度,例如您从多少列中获取数据。

      我曾经在一个超过 150 列的表中进行了一些速度测试,我只需要抓取大约 40 列,并且需要全部 20,000 多条记录。虽然速度差异非常小(我们说的是 20 到 40 毫秒),但使用“SELECT ALL *”从所有列中获取数据实际上更快,而不是“选择所有 Field1、Field2 等” .

      我假设你的表中的记录和列越多,这个例子给你带来的速度差异就越大,但我从来不需要在更极端的情况下测试它,比如一个表中有 500 万条记录。

      【讨论】:

        【解决方案3】:

        是的。

        如果一个表很小并且整个数据库很小,当您从表中选择任何内容时,很可能所有数据都已经在内存中并且可以立即返回结果。

        如果表很大,但您有索引,并且您正在对索引列进行简单选择,则可以扫描索引,然后可以从磁盘读取正确的块并返回结果。

        如果没有可以使用的索引,那么数据库将进行全表扫描,逐块读取表以查找匹配项。

        如果索引列和选择查询列之间存在部分映射,则数据库可以尝试最小化应读取的块数。并且可以在正确选择索引结构和类型(BITMAP / REGULAR)方面花很多心思

        这只是针对从单个表中选择而无需任何计算的最基本的 SQL。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-12
          • 2014-01-05
          • 1970-01-01
          • 2019-11-04
          • 2012-11-09
          • 1970-01-01
          • 1970-01-01
          • 2014-09-18
          相关资源
          最近更新 更多