在早期的cassandra的版本中,cassandra的memtable,数据检索的时候暂时存放的ColumnFamily,基本上只有一种结构就是ConcurrentSkipListMap。ConcurrentSkipListMap通过名字就知道是线程安全的集合,并且内部是内部是采用链表的结构,所以检索的性能也很高。但是作为数据库而言,底层结构的性能即使是纳秒级的差距,都会对数据库的性能产生比较大的影响。也许正是如此,像cassandra这种海量数据级的数据库,也要不断提升流程中最适合的集合。
1、ThreadSafeSortedColumns
ThreadSafeSortedColumns是继承ConcurrentSkipListMap集合的,所以线程安全,并且数据是排序的,根据key来达到去除重复的效果,所以主要应用于memtable中用于存放数据,并且将memtable中的数据排好序,排好序主要也是便于查询,已经序列化到sstable中,也便于查询。
2、ArrayBackedSortedColumns
ArrayBackedSortedColumns是继承ArrayList集合的,ArrayList集合是线程不安全,数据存放在集合中时无序的,所以写入集合的速度是最快的,查询的时候,一般需要自己逐个遍历集合中的每一个元素。但是ArrayBackedSortedColumns虽然继承了ArrayList集合,线程不安全,写入速度也比较快,但是写入的时候,还是会进行排序,查询的时候也不是一味的进行逐个元素的遍历,而是进行二分查找法。
由于ArrayBackedSortedColumns在插入的时候,做了排序的处理,所以当数据是无序的时候,就没有比ThreadSafeSortedColumns插入性能更快的优势。
实验:ThreadSafeSortedColumns 和ArrayBackedSortedColumns的插入性能比较。
1、插入100000数据,而是有序的插入,ArrayBackedSortedColumns的插入性能高于ThreadSafeSortedColumns
add (org.apache.cassandra.db.ThreadSafeSortedColumns):176
add (org.apache.cassandra.db.ArrayBackedSortedColumns):81
2、插入100000数据,而是无序的插入,ArrayBackedSortedColumns的插入性能低于ThreadSafeSortedColumns
add (org.apache.cassandra.db.ThreadSafeSortedColumns):609
add (org.apache.cassandra.db.ArrayBackedSortedColumns):3205
实验结果表明:ArrayBackedSortedColumns在有序的数据插入的时候,性能高于ThreadSafeSortedColumns。所以ArrayBackedSortedColumns主要被应用于,并行迭代的查询中,而查询的时候,在并行迭代扫描数据的时候,查询出来的数据将会是有序的。
3、TreeMapBackedSortedColumns
TreeMapBackedSortedColumns是继承TreeMap集合的,可以用于数据的排序,查询性能很高,但是线程并不安全。
实验:ThreadSafeSortedColumns,ArrayBackedSortedColumns,TreeMapBackedSortedColumns的插入性能比较。
1、插入100000数据,而是有序的插入,ArrayBackedSortedColumns插入性能最高
add (org.apache.cassandra.db.ThreadSafeSortedColumns):172
add (org.apache.cassandra.db.ArrayBackedSortedColumns):99
add (org.apache.cassandra.db.TreeMapBackedSortedColumns):342
2、插入100000数据,而是无序的插入,TreeMapBackedSortedColumns插入性能最高
add (org.apache.cassandra.db.ThreadSafeSortedColumns):612
add (org.apache.cassandra.db.ArrayBackedSortedColumns):3166
add (org.apache.cassandra.db.TreeMapBackedSortedColumns):404
实验结果表明:TreeMapBackedSortedColumns在无序的数据插入的时候,性能最高。所以TreeMapBackedSortedColumns主要被应用于数据无序的时候,进行导入,排序,然后可以直接写sstable。
实验:ThreadSafeSortedColumns,ArrayBackedSortedColumns,TreeMapBackedSortedColumns的查询性能比较。
get (org.apache.cassandra.db.ThreadSafeSortedColumns):155
get (org.apache.cassandra.db.ArrayBackedSortedColumns):96
get (org.apache.cassandra.db.TreeMapBackedSortedColumns):57
实验结果表明:TreeMapBackedSortedColumns在数据的查询性能高于ArrayBackedSortedColumns高于ThreadSafeSortedColumns。
public void addColumn(IColumn column, Allocator allocator)
{
if (isEmpty())
{
add(column);
return;
}
// Fast path if inserting at the tail
int c = compare(get(size() - 1).name(), column.name());
// note that we want an assertion here (see addColumn javadoc), but we also want that if
// assertion are disabled, addColumn works correctly with unsorted input
assert c <= 0 : "Added column does not sort as the " + (reversed ? "first" : "last") + " column";
if (c < 0)
{
// Insert as last
add(column);
}
else if (c == 0)
{
// Resolve against last
resolveAgainst(size() - 1, column, allocator);
}
else
{
int pos = binarySearch(column.name());
if (pos >= 0)
resolveAgainst(pos, column, allocator);
else
add(-pos-1, column);
}
}
private int compare(ByteBuffer name1, ByteBuffer name2)
{
if (reversed)
return comparator.reverseComparator.compare(name1, name2);
else
return comparator.compare(name1, name2);
}