Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 与数据库索引的写入相比的读取数_Database_Indexing - Fatal编程技术网

Database 与数据库索引的写入相比的读取数

Database 与数据库索引的写入相比的读取数,database,indexing,Database,Indexing,众所周知,只有当您有大表且读多于写时,数据库索引才有意义,因为索引的创建会导致额外的写入开销,因为数据库中的每次修改也会导致索引的修改 如果我们假设数据库的索引结构是 a) B+树 b) 哈希表 与开始实施数据库索引的写入次数相比,读取次数的经验法则是什么 有关数据库索引工作原理的信息,请查看使用数据库的目的通常是减少在数据中查找内容的时间,因此它是关于“读取”。我非常肯定,90%的人使用数据库进行“阅读”,如果不是100%的话 让我们考虑几个案例: 只写不读:有什么意义?只是为了备份?那么

众所周知,只有当您有大表且读多于写时,数据库索引才有意义,因为索引的创建会导致额外的写入开销,因为数据库中的每次修改也会导致索引的修改

如果我们假设数据库的索引结构是 a) B+树 b) 哈希表 与开始实施数据库索引的写入次数相比,读取次数的经验法则是什么


有关数据库索引工作原理的信息,请查看

使用数据库的目的通常是减少在数据中查找内容的时间,因此它是关于“读取”。我非常肯定,90%的人使用数据库进行“阅读”,如果不是100%的话

让我们考虑几个案例:

  • 只写不读:有什么意义?只是为了备份?那么 备份将在还原时用于读取
  • 写得多,读得少:我想不出这种情况,但当你遇到这种情况时,你更看重哪一种?快速呈现数据?或者您保存数据的速度有多快?如果您重视数据保存的速度,那么您可以删除索引并进行夜间运行来显示数据(考虑到数据保存的速度,我确信它足够大,需要夜间运行来汇总数据),因此您有一个近乎实时的写入和H+1或更多的延迟数据读取,这就引出了一个问题:拥有这样的配置有什么意义
  • 少写多读:这是最常见的情况
  • 不写,只读:100%你不能产生这种情况,不写,那么读什么

对不起,我的英语不好,希望对你有帮助。

使用数据库的目的通常是为了减少在数据中查找内容的时间,因此它是关于“阅读”的。我非常肯定,90%的人使用数据库进行“阅读”,如果不是100%的话

让我们考虑几个案例:

  • 只写不读:有什么意义?只是为了备份?那么 备份将在还原时用于读取
  • 写得多,读得少:我想不出这种情况,但当你遇到这种情况时,你更看重哪一种?快速呈现数据?或者您保存数据的速度有多快?如果您重视数据保存的速度,那么您可以删除索引并进行夜间运行来显示数据(考虑到数据保存的速度,我确信它足够大,需要夜间运行来汇总数据),因此您有一个近乎实时的写入和H+1或更多的延迟数据读取,这就引出了一个问题:拥有这样的配置有什么意义
  • 少写多读:这是最常见的情况
  • 不写,只读:100%你不能产生这种情况,不写,那么读什么

对不起,我的英语不好,希望对你有帮助。这里有很多因素。例如,索引数据是否在缓存中?数据块是否在缓存中?查询检索了多少行?在桌子上锄许多行等 我已经被问了很多次这个问题(或它的变体)。我宁愿提供一些信息,让提出问题的人能够做出明智的决定,而不是给出数字。下面是一个“信封背面”计算示例,其中包含一些已声明的假设

  • 假设这张桌子有100万行
  • 假设一行平均为200字节
    • 比意味着表消耗约19GB(忽略任何压缩)
  • 假设索引已完全缓存,并且需要零时间
  • 假设数据必须从磁盘读取,每次读取5毫秒
  • 假设IO子系统可以以10 GB/s的速度传输数据
  • 假设需要从表中读取50000行。我们还假设这些行是分散的,这样两个所需的行位于同一块中

    好的,现在我们可以做一些数学题了

    情景1。使用索引

    • 索引读取是零时间
    • 数据块读取:25000个数据块@5ms每个数据块为125s
    情景2。扫描桌子

    • 以10GB/s速度扫描的19GB为2s
    因此,在这种情况下,扫描数据要比使用索引快得多


  • 这里涉及到很多因素。例如,索引数据是否在缓存中?数据块是否在缓存中?查询检索了多少行?在桌子上锄许多行等 我已经被问了很多次这个问题(或它的变体)。我宁愿提供一些信息,让提出问题的人能够做出明智的决定,而不是给出数字。下面是一个“信封背面”计算示例,其中包含一些已声明的假设

  • 假设这张桌子有100万行
  • 假设一行平均为200字节
    • 比意味着表消耗约19GB(忽略任何压缩)
  • 让我们假设索引已完全缓存,并且花费的时间为零
  • 假设数据必须从磁盘读取,每次读取5毫秒
  • 假设IO子系统可以以10 GB/s的速度传输数据
  • 假设需要从表中读取50000行。我们还假设这些行是分散的,这样两个所需的行位于同一块中

    好的,现在我们可以做一些数学题了

    情景1。使用索引

    • 索引读取是零时间
    • 数据块读取:25000个数据块@5ms每个数据块为125s
    情景2。扫描桌子

    • 以10GB/s速度扫描的19GB为2s
    因此,在这种情况下,扫描数据要比使用索引快得多

  • 成本公式

    没什么: