众所周知,数据库索引只有在有大表时才有意义,而且读取量大于写入量,因为索引的创建会导致额外的写入开销,因为数据库中的每次修改都会导致索引的修改。
如果我们假设数据库的索引结构是( a)一个B+树( b)一个哈希表,那么与实现数据库索引开始有意义的写入数相比,读取次数的经验规则是什么?
有关数据库索引工作方式的信息,请参阅How does database indexing work?。
发布于 2016-12-30 19:08:45
这里涉及到许多因素。例如,缓存中是否有索引数据?缓存中有数据块吗?查询检索了多少行?锄头,表格中的许多行,等等,我已经被问了很多次这个问题(或它的一个变体)。与其给出数字,我更愿意提供一些信息,这样提问的人才能做出明智的决定。这里是一个“信封背面”的计算例子,并有一些陈述的假设。
- Index reads are zero time
- Data block reads: 25,000 blocks @5ms each is 125s场景2.扫描表
- 19GB scanned at 10GB/s is 2s因此,在这种情况下,扫描数据要比使用索引快得多。
发布于 2017-01-02 10:34:04
费用公式
什么也没有:
( a) b阶B+树
b) Hashtable
成本按n= 1000计算
什么也没有:
( a1) 2阶B+树
a2) 10阶B+树
b) Hashtable
成本n= 1000000
什么也没有:
( a1) 2阶B+树
a2) 10阶B+树
b) Hashtable
也有相当大的成本收益,可以通过击中硬件缓存的后续命中。准确的收益取决于安装数据库的硬件。
成本并不都是很容易比较的。哈希计算通常比查找更昂贵,但当n变大时,则保持不变。B树查找和顺序DB查找可能会到达硬件缓存(因为加载了整个块)。
表越大,索引就越重要(参见n=1000对n=1000000的成本)。因此,写入和读取的数量将随表的大小而变化。
您还应该考虑到您的特定查询。例如,哈希表没有排序,而B树是排序的。因此,如果查询需要获取最小值和最大值之间的所有值,B树的性能将优于哈希表(良好的哈希是均匀分布的)。
通常,您必须度量查询和实际使用的插入的性能。您可以在没有索引的情况下开始,然后在需要时添加索引。以后可以添加索引,而不必使用DB更改程序的查询(不过,查询的响应时间会改变,如果使用索引,读取将变得更快,写入将变得更慢)。
如果在特定情况下,您有一个包含大量插入和一个读取周期的load操作,则可以暂时关闭索引并在加载后重新计算它。
参考文献:
B树与哈希表:
https://cs.stackexchange.com/questions/270/hash-tables-versus-binary-trees
缓存
http://www.moreprocess.com/devices/computer-memory-hierarchy-internal-register-cache-ram-hard-disk-magnetic-tape
发布于 2016-12-29 04:37:46
使用数据库的目的通常是减少在数据中查找某物的时间,因此它是关于“阅读”的。我非常肯定,90%的人使用数据库来“阅读”,如果不是100%的话。
让我们想想几个例子:
对不起我的英语,希望它能帮上忙
https://stackoverflow.com/questions/41303090
复制相似问题