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';
結論:
如果有相關的頁面、或者業務邏輯。
那麼設計聯合主鍵時,第一個主鍵,建議是必填的、使用頻率最高的。
關於提高查詢效率,還有二級索引可以使用。