Covered Indexes(覆蓋索引)覆蓋索引是在索引表中直接存儲(chǔ)某些常用字段,當(dāng)查詢時(shí)所有字段僅涉及索引表中包含的字段時(shí),則無需再在基于 rowkey 索引的數(shù)據(jù)表中查詢,提高了查詢的效率 。
比如,我們?cè)趏perate_log 表 “f”.”time” 列上創(chuàng)建一個(gè)索引,并在索引中包含 “f”.”lat”, “f”.”lon” 列:
0: jdbc:phoenix:> create index index_operate_log_time2 on "operate_log" ("f"."time") INCLUDE("f"."lat", "f"."lon");(可左右滑動(dòng))
2,799,827 rows affected (133.367 seconds)
這樣我們做類似如下查詢時(shí)就可以直接走索引表,以提高查詢性能:
0: jdbc:phoenix:> select "f"."lat", "f"."lon" from "operate_log" where "f"."time" between '1538216707720' and '1538223834000' limit 10;(可左右滑動(dòng))
Functional Indexes(函數(shù)索引)函數(shù)索引是在 Phoeinx 4.3 版本之后新增的,它使得索引的建立不僅僅只限于基于列,而可以使用任意的表達(dá)式來創(chuàng)建索引,在查詢時(shí),如出現(xiàn)相同的表達(dá)式查詢條件,則會(huì)自動(dòng)優(yōu)先檢索索引表 。
比如,我們?cè)趏perate_log 表上基于 substr ( “f”.”time”, 1, 10) 創(chuàng)建一個(gè)索引:
0: jdbc:phoenix:> create index index_operate_log_time3 on "operate_log" (substr("f"."time", 1, 10));(可左右滑動(dòng))
2,799,827 rows affected (94.74 seconds)
這樣創(chuàng)建索引后,我們就可以使用相同表達(dá)式走索引表進(jìn)行查詢優(yōu)化了,比如:
0: jdbc:phoenix:> select count(*) from "operate_log" where substr("f"."time", 1, 10) between '1538216707' and '1538223834';(可左右滑動(dòng))
+-----------+
| COUNT(1) |
+-----------+
| 5886 |
+-----------+
1 row selected (0.059 seconds)
Global Indexes(全局索引)上面的覆蓋索引和函數(shù)索引都屬于全局索引,也是 Phoenix 默認(rèn)的索引創(chuàng)建模式 。
全局索引將索引表和數(shù)據(jù)表分開存儲(chǔ),如以上例子中都會(huì)創(chuàng)建一張新的索引表,因此每條數(shù)據(jù)和其索引數(shù)據(jù)可能會(huì)分布在不同的數(shù)據(jù)節(jié)點(diǎn)上,數(shù)據(jù)表的添加、刪除和修改都會(huì)更新相關(guān)的索引表,所以寫入數(shù)據(jù)時(shí)由于額外的網(wǎng)絡(luò)開銷會(huì)帶來較大的性能消耗 。而查詢數(shù)據(jù)的時(shí)候,Phoenix 會(huì)通過索引表來快速低損耗的獲取數(shù)據(jù) 。因此全局索引更適合讀多寫少的使用場(chǎng)景 。
Local Indexes(本地索引)本地索引與全局索引相反,在 4.8.0 版本之后會(huì)將索引數(shù)據(jù)以特定的列簇存儲(chǔ)在同一張數(shù)據(jù)表中,并通過特定的 rowkey 設(shè)置,將每條數(shù)據(jù)及其索引數(shù)據(jù)存儲(chǔ)在同一 region 中,因此在數(shù)據(jù)寫入時(shí)防止了額外的網(wǎng)絡(luò)開銷,而在讀取數(shù)據(jù)時(shí)因無法提前判斷索引數(shù)據(jù)的準(zhǔn)確位置,則會(huì)在所有的 region 中檢索索引數(shù)據(jù),而非常影響讀取性能 。所以本地索引更適合于寫多讀少的使用場(chǎng)景 。
本地索引只要在原來索引創(chuàng)建時(shí)增加 local 關(guān)鍵字即可,比如:
0: jdbc:phoenix:> create local index index_operate_log_time on "operate_log" ("f"."time");(可左右滑動(dòng))
總結(jié)Phoenix 是構(gòu)建在 HBase 之上的 SQL 層,不僅能夠提供標(biāo)準(zhǔn)的 SQL 查詢,還能夠?yàn)?HBase 提供二級(jí)索引能力,在 HBase 使用場(chǎng)景中應(yīng)用非常廣泛 。Phoenix 二級(jí)索引主要分為全局索引和本地索引,全局索引適合那些讀多寫少的場(chǎng)景,本地索引更適合那些寫多讀少的場(chǎng)景 。判斷是否走索引可以 explain SQL 查看具體執(zhí)行計(jì)劃 。
參考:
1. HBase集成Phoenix,構(gòu)建Phoenix view和table的區(qū)別
2. 如何使用Phoenix在CDH的HBase中創(chuàng)建二級(jí)索引
3. 產(chǎn)品 | Cloudera正式宣布在CDH中支持Apache Phoenix
◆Apache Hudi 0.5.1版本重磅發(fā)布
◆貝殼找房基于 Flink 的實(shí)時(shí)平臺(tái)建設(shè)
◆網(wǎng)易大數(shù)據(jù)基礎(chǔ)平臺(tái)建設(shè)之路
以上關(guān)于本文的內(nèi)容,僅作參考!溫馨提示:如遇健康、疾病相關(guān)的問題,請(qǐng)您及時(shí)就醫(yī)或請(qǐng)專業(yè)人士給予相關(guān)指導(dǎo)!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內(nèi)容,希望對(duì)您有所幫助:- 感受自然什么
- 學(xué)校班務(wù)管理工作總結(jié)
- 成長需要什么議論文600字作文
- 不文明手抄報(bào)該寫什么
- 關(guān)于五行的解釋
- 大學(xué)畢業(yè)怎么考研
- 東北師范地理考研
- 美術(shù)史考研書籍推薦
- 寫一篇關(guān)于今天發(fā)生什么事的日記
- 消失的什么作文開頭
