首頁 > 軟體

Apache Doris的Bitmap索引和BloomFilter索引使用及注意事項

2022-09-28 14:01:23

1. Bitmap索引的使用

1.1 Bitmap索引介紹

bitmap index是一種點陣圖索引,是一種快速資料結構,能夠加快查詢速度

1.2 Bitmap索引使用的注意事項

使用限制

  • 目前索引僅支援bitmap型別的索引
  • bitmap索引僅在單列上建立
  • bitmap索引能夠應用在Duplicate、Uniq資料模型的所有列和Aggregate模型的key列上
  • bitmap索引僅在Segment V2儲存格式下生效。當建立index時,表的儲存格式將預設轉換為V2格式

bitmap索引支援的資料型別:

  • TINYINT
  • SMALLINT
  • INT
  • UNSIGNEDINT
  • BIGINT
  • CHAR
  • VARCHAR
  • DATE
  • DATETIME
  • LARGEINT
  • DECIMAL
  • BOOL

1.3 Bitmap索引的使用

建立索引

mysql> create index if not exists click_bitmap_index on test_db.click (user_id) using bitmap comment 'bitmap index test';
Query OK, 0 rows affected (0.05 sec)

mysql> 

檢視索引

mysql> show index from test_db.click;
+-------------------------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-------------------+
| Table                         | Non_unique | Key_name           | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment           |
+-------------------------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-------------------+
| default_cluster:test_db.click |            | click_bitmap_index |              | user_id     |           |             |          |        |      | BITMAP     | bitmap index test |
+-------------------------------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+-------------------+
1 row in set (0.04 sec)

mysql> 

刪除索引

mysql> drop index if exists click_bitmap_index on test_db.click;
Query OK, 0 rows affected (0.03 sec)

mysql> 

2. BloomFilter索引

2.1 BloomFilter索引介紹

是一種多雜湊函數對映的快速查詢演演算法,本質上是一種點陣圖結構。通常應用在一些需要快速判斷某個元素是否屬於集合,但是並不嚴格要求100%正確的場合,因為BloomFilter會告訴呼叫者一個元素存在或不存在一個集合。但存在不一定準確

2.2 BloomFilter原理

實際上是由一個超長的二進位制位陣列和一系列的雜湊函陣列成。二進位制位陣列初始全部為0,當給定一個元素時,這個元素會被一系列雜湊函數計算對映出一系列的值,所有的值在位陣列的偏移量處置為1。而對於一個待查詢的元素,也會用相同的雜湊函數對映到位陣列上,只要有一個雜湊函數對映沒有命中之前的元素的偏移量,則不存在於集合中

下圖所示出一個m=18, k=3(m是該Bit陣列的大小,k是Hash函數的個數)的Bloom Filter範例。集合中的x、y、z三個元素通過3個不同的雜湊函數雜湊到位陣列中。當查詢元素w時,通過Hash函數計算之後因為有一個位元為0,因此w不在該集合中

BloomFilter索引也是以Block為粒度建立的。每個Block中,指定列的值作為一個集合生成一個BloomFilter索引條目,用於在查詢是快速過濾不滿足條件的資料

2.3 BloomFilter索引的使用

建立表使用BloomFilter索引

mysql> create table order_tb(
    -> user_id bigint,
    -> order_date date,
    -> city varchar(32),
    -> url varchar(512)
    -> ) distributed by hash(user_id, city) buckets 8
    -> properties(
    -> 'bloom_filter_columns'='user_id,order_date'
    -> );
Query OK, 0 rows affected (0.07 sec)

mysql> 

檢視BloomFilter索引

mysql> show create table order_tb;

刪除BloomFilter索引

mysql> alter table test_db.order_tb set ('bloom_filter_columns' = '');
Query OK, 0 rows affected (0.05 sec)

mysql>

修改BloomFilter索引

mysql> alter table test_db.order_tb set ('bloom_filter_columns' = 'user_id,city');
Query OK, 0 rows affected (0.05 sec)

mysql> 

2.4 Doris BloomFilter使用場景

  • 首先BloomFilter適用於非字首過濾
  • 查詢會根據該列高頻過濾,而且查詢條件大多是in和=過濾
  • 不同於Bitmap, BloomFilter適用於高基數列。比如UserID。因為如果建立在低基數的列上,比如”性別“列,則每個Block幾乎都會包含所有取值,導致BloomFilter索引失去意義

2.5 Doris BloomFilter使用注意事項

  • 不支援對Tinyint、Float、Double 型別的列建Bloom Filter索引
  • Bloom Filter索引只對in和=過濾查詢有加速效果
  • 如果要檢視某個查詢是否命中了Bloom Filter索引,可以通過查詢的Profile資訊檢視

到此這篇關於Apache Doris的Bitmap索引和BloomFilter索引使用的文章就介紹到這了,更多相關Apache Doris索引內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com