1. 程式人生 > >phoenix 聯合主鍵的探索

phoenix 聯合主鍵的探索

連線上phoenix,建一個測試表:

create table test12(email varchar not null,id integer not null,name varchar not null,age integer,aihao varchar CONSTRAINT PK PRIMARY KEY (EMAIL,id,name));

這是3個欄位組成的聯合主鍵。

剛接觸時,由於查詢的條件較多。我曾想著把所有欄位都設定成主鍵。那不是全部搞定了,哈哈哈。(別做夢,醒一醒,年輕人)

顯然將所有欄位都設計成,主鍵是不合理的。

我認為phoenix 主鍵的目的有兩點:

1、與關係型資料庫一樣,唯一標識資料。

或許會用到這種語句:

UPSERT INTO TEST(ID, MY_COL) VALUES(123, 0) ON DUPLICATE KEY IGNORE;

2、作為查詢的條件。

Hbase 的 rowKey 就是快。

開了個小差,回到正題:

測試表聯合主鍵的先後順序是(EMAIL,id,name)

那麼如下SQL,有區別嗎?

select * from test12 where email='a' and id=1;

select * from test12 where id=1 and email='a';

看一下執行計劃

explain select * from test12 where email='a' and id=1;

explain select * from test12 where id=1 and email='a';

兩個結果相同:

雖然會自動優化成相同的順序,建議寫條件時,還是按照順序來寫SQL。

再看一下,這兩個有區別嗎?

select * from test12 where id=1;

select * from test12 where email='a';

執行計劃:

條件為id的是全表掃描,而email是範圍掃描。效率可想而知。

這種情況也是會進行範圍掃描,但name條件走的是過濾篩選。

select * from test12 where email='a' and name='b';

結論:

如果有相關的頁面、或者業務邏輯。

那麼設計聯合主鍵時,第一個主鍵,建議是必填的、使用頻率最高的。

關於提高查詢效率,還有二級索引可以使用。