2021年大数据HBase(十二):Apache Phoenix 二级索引
全網(wǎng)最詳細的大數(shù)據(jù)HBase文章系列,強烈建議收藏加關注!
新文章都已經(jīng)列出歷史文章目錄,幫助大家回顧前面的知識重點。
目錄
系列歷史文章
前言
Apache Phoenix 二級索引
一、索引分類
二、索引分類_全局索引
三、索引分類_本地索引
四、索引分類_覆蓋索引
五、索引分類_函數(shù)索引
六、索引案例一: 創(chuàng)建全局索引+覆蓋索引
1、需求
2、創(chuàng)建索引
3、查詢數(shù)據(jù)
4、查詢執(zhí)行計劃
5、刪除索引
6、查看索引
7、測試查詢所有列是否會使用索引
8、使用Hint強制使用索引
七、索引案例二: 創(chuàng)建本地索引
1、查看數(shù)據(jù)
2、刪除索引
八、陌陌案例二級索引構建
1、創(chuàng)建本地函數(shù)索引
2、執(zhí)行數(shù)據(jù)查詢
系列歷史文章
2021年大數(shù)據(jù)HBase(十七):HBase的360度全面調(diào)優(yōu)
2021年大數(shù)據(jù)HBase(十六):HBase的協(xié)處理器(Coprocessor)
2021年大數(shù)據(jù)HBase(十五):HBase的Bulk Load批量加載操作
2021年大數(shù)據(jù)HBase(十四):HBase的原理及其相關的工作機制
2021年大數(shù)據(jù)HBase(十三):HBase讀取和存儲數(shù)據(jù)的流程
2021年大數(shù)據(jù)HBase(十二):Apache Phoenix 二級索引
2021年大數(shù)據(jù)HBase(十一):Apache Phoenix的視圖操作
2021年大數(shù)據(jù)HBase(十):Apache Phoenix的基本入門操作
2021年大數(shù)據(jù)HBase(九):Apache Phoenix的安裝
2021年大數(shù)據(jù)HBase(八):Apache Phoenix的基本介紹
2021年大數(shù)據(jù)HBase(七):Hbase的架構!【建議收藏】
2021年大數(shù)據(jù)HBase(六):HBase的高可用!【建議收藏】
2021年大數(shù)據(jù)HBase(五):HBase的相關操作-JavaAPI方式!【建議收藏】
2021年大數(shù)據(jù)HBase(四):HBase的相關操作-客戶端命令式!【建議收藏】
2021年大數(shù)據(jù)HBase(三):HBase數(shù)據(jù)模型
2021年大數(shù)據(jù)HBase(二):HBase集群安裝操作
2021年大數(shù)據(jù)HBase(一):HBase基本簡介
前言
?2021大數(shù)據(jù)領域優(yōu)質(zhì)創(chuàng)作博客,帶你從入門到精通,該博客每天更新,逐漸完善大數(shù)據(jù)各個知識體系的文章,幫助大家更高效學習。
Apache Phoenix 二級索引
因為沒有建立索引,組合條件查詢效率較低,而通過使用Phoenix,我們可以非常方便地創(chuàng)建二級索引。Phoenix中的索引,其實底層還是表現(xiàn)為HBase中的表結構。這些索引表專門用來加快查詢速度。
一、索引分類
- 全局索引
- 本地索引
- 覆蓋索引
- 函數(shù)索引
二、索引分類_全局索引
- 全局索引適用于讀多寫少業(yè)務
- 全局索引絕大多數(shù)負載都發(fā)生在寫入時,當構建了全局索引時,Phoenix會攔截寫入(DELETE、UPSERT值和UPSERT SELECT)上的數(shù)據(jù)表更新,構建索引更新,同時更新所有相關的索引表,開銷較大
- 讀取時,Phoenix將選擇最快能夠查詢出數(shù)據(jù)的索引表。默認情況下,除非使用Hint,如果SELECT查詢中引用了其他非索引列,該索引是不會生效的
- 全局索引一般和覆蓋索引搭配使用,讀的效率很高,但寫入效率會受影響
- 創(chuàng)建語法: ? CREATE INDEX 索引名稱 ON 表名 (列名1, 列名2, 列名3...)
三、索引分類_本地索引
- 本地索引適合寫操作頻繁,讀相對少的業(yè)務
- 當使用SQL查詢數(shù)據(jù)時,Phoenix會自動選擇是否使用本地索引查詢數(shù)據(jù)
- 在本地索引中,索引數(shù)據(jù)和業(yè)務表數(shù)據(jù)存儲在同一個服務器上,避免寫入期間的其他網(wǎng)絡開銷
- 在Phoenix 4.8.0之前,本地索引保存在一個單獨的表中,在Phoenix 4.8.1中,本地索引的數(shù)據(jù)是保存在一個影子列蔟中
- 本地索引查詢即使SELECT引用了非索引中的字段,也會自動應用索引的
- 注意:創(chuàng)建表的時候指定了SALT_BUCKETS,是不支持本地索引的
- 創(chuàng)建語法: ? CREATE LOCAL?INDEX 索引名稱 ON 表名 (列名1, 列名2, 列名3...)?
四、索引分類_覆蓋索引
hoenix提供了覆蓋的索引,可以不需要在找到索引條目后返回到主表。Phoenix可以將關心的數(shù)據(jù)捆綁在索引行中,從而節(jié)省了讀取時間的開銷。
? ? ? ?例如,以下語法將在v1和v2列上創(chuàng)建索引,并在索引中包括v3列,也就是通過v1、v2就可以直接把數(shù)據(jù)查詢出來。
CREATE INDEX my_index ON my_table (v1,v2) INCLUDE(v3)
-
可以被表中任意的字段構建覆蓋 索引, 建立之后, 可以在查詢的時候, 不需要在去到主表查詢, 可以減少查詢的時間, 提升效率, 但是帶來弊端, 導致數(shù)據(jù)出現(xiàn)冗余情況
-
注意: 無法單獨使用, 必須結合全局或者本地索引
-
創(chuàng)建語法: create [local] index my_index on 目標表(列1,列2...) include(覆蓋索引列....)
五、索引分類_函數(shù)索引
函數(shù)索引(4.3和更高版本)可以支持在列上創(chuàng)建索引,還可以基于任意表達式上創(chuàng)建索引。然后,當查詢使用該表達式時,可以使用索引來檢索結果,而不是數(shù)據(jù)表。例如,可以在UPPER(FIRST_NAME||‘ ’||LAST_NAME)上創(chuàng)建一個索引,這樣將來搜索兩個名字拼接在一起時,索引依然可以生效。
-- 創(chuàng)建索引 ? ? ? ?
CREATE INDEX UPPER_NAME_IDX ON EMP (UPPER(FIRST_NAME||' '||LAST_NAME))
-- 以下查詢會走索引 ? ? ? ?
SELECT EMP_ID FROM EMP WHERE UPPER(FIRST_NAME||' '||LAST_NAME)='JOHN DOE'
- ?可以針對某一個函數(shù)的結果 構建索引, 將結果數(shù)據(jù)建好索引, 這樣當我們使用這個函數(shù)時可以直接將結果返回
- 創(chuàng)建語法:??create ?index ?索引名稱 on 表名(函數(shù))
六、索引案例一: 創(chuàng)建全局索引+覆蓋索引
1、需求
我們需要根據(jù)用戶ID來查詢訂單的ID以及對應的支付金額。
例如:查詢已付款的訂單ID和支付金額 ? ? ? ?
此時,就可以在USER_ID列上創(chuàng)建索引,來加快查詢
2、創(chuàng)建索引
create index GBL_IDX_ORDER_DTL on ORDER_DTL(C1."user_id") INCLUDE("id", C1."money"); ? ?
??可以在HBase shell中看到,Phoenix自動幫助我們創(chuàng)建了一張GBL_IDX_ORDER_DTL的表。這種表就是一張索引表
3、查詢數(shù)據(jù)
select?"user_id",?"id",?"money"?from?ORDER_DTL?where?"user_id"?=?'8237476';
4、查詢執(zhí)行計劃
explain select "user_id", "id", "money" from ORDER_DTL where "user_id" = '8237476';
5、刪除索引
使用drop index 索引名 ON 表名
drop?index?IDX_ORDER_DTL_DATE?on?ORDER_DTL;
6、查看索引
!table
7、測試查詢所有列是否會使用索引
explain?select?*?from?ORDER_DTL?where?"user_id"?=?'8237476';
8、使用Hint強制使用索引
explain?select?/*+?INDEX(ORDER_DTL?GBL_IDX_ORDER_DTL)?*/?*?from?ORDER_DTL?where?USER_ID?=?'8237476';
?通過執(zhí)行計劃,我們可以觀察到查看全局索引,找到ROWKEY,然后執(zhí)行全表的JOIN,其實就是把對應ROWKEY去查詢ORDER_DTL表。
七、索引案例二: 創(chuàng)建本地索引
1、查看數(shù)據(jù)
explain?select?*?from?ORDER_DTL?WHERE?"status"?=?'已提交';
explain?select?*?from?ORDER_DTL?WHERE?"status"?=?'已提交'?AND?"pay_way"?=?1;
?通過觀察上面的兩個執(zhí)行計劃發(fā)現(xiàn),兩個查詢都是通過RANGE SCAN來實現(xiàn)的。說明本地索引生效
2、刪除索引
drop?index?LOCAL_IDX_ORDER_DTL?on?ORDER_DTL;
八、陌陌案例二級索引構建
1、創(chuàng)建本地函數(shù)索引
CREATE?LOCAL?INDEX?LOCAL_IDX_MOMO_MSG?ON?MOMO_CHAT.MSG(substr("msg_time", 0, 10),?"sender_account",?"receiver_account");
2、執(zhí)行數(shù)據(jù)查詢
explain select "C1"."sender_account", "C1"."receiver_account","C1"."msg_time","C1"."message" from "MOMO_CHAT"."MSG" where substr("C1"."msg_time",0,10) = '2021-01-16' and "C1"."sender_account" = '17344828999' and "C1"."receiver_account" = '18040049394';
?可以看到,查詢速度非常快,0.1秒就查詢出來了數(shù)據(jù)。
- 📢博客主頁:https://lansonli.blog.csdn.net
- 📢歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請指正!
- 📢本文由 Lansonli 原創(chuàng),首發(fā)于 CSDN博客🙉
- 📢大數(shù)據(jù)系列文章會每天更新,停下休息的時候不要忘了別人還在奔跑,希望大家抓緊時間學習,全力奔赴更美好的生活?
總結
以上是生活随笔為你收集整理的2021年大数据HBase(十二):Apache Phoenix 二级索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年大数据HBase(十一):Ap
- 下一篇: ❤️Spark的关键技术回顾,持续更新!