假设我们有一个用户表被用户id划分为整数1,2,3.n。我可以使用用于划分表的一致散列方式吗?
这样做的好处是,如果分区的数量增加或减少,则旧索引可以相同。
问题A。
使用一致的散列算法来做分区表是个好主意吗?
问题B,.
任何关系数据库都支持吗?
我想一些nosql数据库已经在使用它了。
但是这里的数据库指的是关系数据库。
我在一次面试中遇到了这个问题。在第一个反应中,我只是用长度来回答mod,但是如果将表划分成更多的部分,则会引起问题。
发布于 2011-08-19 08:24:39
关于oracle散列分区,部分来自oracle帮助文档
经过一些研究之后,甲骨文实际上确实支持通过默认的散列分区实现一致的散列。虽然它的行为是一个秘密,没有公布。但是它实际上利用了HashMap的方式,但是隐藏了一些分区。因此,当您添加/删除分区时,oracle在不同分区中调整数据的工作非常少。算法只确保将数据均匀地分割成2次方的分区,如4。因此,如果不是,那么合并/拆分一些分区。
神奇的是,如果要从四个分区增加到五个分区,它实际上将一个分区扩展为两个分区。如果要将四个分区缩减为三个分区,则实际上将两个分区合并为一个分区。
如果任何人有更多的洞察力,添加一个更详细的答案。
哈希分区哈希分区基于Oracle应用于您标识的分区键的散列算法将数据映射到分区。散列算法在分区之间平均分配行,使分区大小大致相同。
哈希分区是在设备之间均匀分布数据的理想方法。哈希分区也是范围分区的一个容易使用的替代方案,特别是当要分区的数据不是历史数据或没有明显的分区键时。
注意:
不能更改分区所使用的散列算法。
关于MYSQL散列分区,部分来自mysql帮助文档
它提供了两个分区函数,一个是通过散列进行分区。另一种是按键划分。
按键进行分区类似于按散列进行分区,除了哈希分区使用用户定义的表达式外,用于密钥分区的散列函数由MySQL服务器提供。MySQL集群为此使用MD5();对于使用其他存储引擎的表,服务器使用自己的内部哈希函数,该函数基于与PASSWORD()相同的算法。创建表的语法规则..。按键划分类似于创建由散列划分的表。
这里列出了主要的区别:
使用密钥而不是散列。
·KEY只接受一个或多个列名的列表。从MySQL 5.1.5开始,作为分区键的一个或多个列必须包含表的一部分或全部主键,如果表有主键的话。
CREATE TABLE k1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20)
)
PARTITION BY KEY()
PARTITIONS 2;如果没有主键但有唯一的键,那么唯一的键用于分区键:
CREATE TABLE k1 (
id INT NOT NULL,
name VARCHAR(20),
UNIQUE KEY (id)
)
PARTITION BY KEY()
PARTITIONS 2;但是,如果未将唯一键列定义为NULL,则前面的语句将失败。
但是它没有说明它是如何分区的,它将不得不查看代码。
发布于 2011-08-18 04:27:17
在我研究了一些像分区(数据库)这样的维基参考页面之后
我相信我的想法属于复合分区。
组合分区允许上述分区方案的某些组合,例如,首先应用范围分区,然后应用哈希分区。一致的散列可以被认为是散列和列表分区的组合,其中哈希将键空间缩小到可以列出的大小。
但是像分区(数据库)这样的链接有点老了。如果有人能找到更多最新的参考资料,那就更好了。我的答案确实不完整。希望有人能回答得更好!
更新
看起来像Jonathan在他的博客中已经提到过,Cassandra分布式数据库现在支持两种分区方案:传统的一致散列方案和保持顺序的分区器。http://spyced.blogspot.com/2009/05/consistent-hashing-vs-order-preserving.html
汤姆·怀特的博客。在java中实现一致散列的示例
import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;
public class ConsistentHash<T> {
private final HashFunction hashFunction;
private final int numberOfReplicas;
private final SortedMap<Integer, T> circle = new TreeMap<Integer, T>();
public ConsistentHash(HashFunction hashFunction, int numberOfReplicas,
Collection<T> nodes) {
this.hashFunction = hashFunction;
this.numberOfReplicas = numberOfReplicas;
for (T node : nodes) {
add(node);
}
}
public void add(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
circle.put(hashFunction.hash(node.toString() + i), node);
}
}
public void remove(T node) {
for (int i = 0; i < numberOfReplicas; i++) {
circle.remove(hashFunction.hash(node.toString() + i));
}
}
public T get(Object key) {
if (circle.isEmpty()) {
return null;
}
int hash = hashFunction.hash(key);
if (!circle.containsKey(hash)) {
SortedMap<Integer, T> tailMap = circle.tailMap(hash);
hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
}
return circle.get(hash);
}
}https://stackoverflow.com/questions/7087000
复制相似问题