Postgresql
使用 IN( 的值列表的字元串索引1,1,1,2):btree 索引會起作用嗎?
我們有一個查詢需要將一個值與 where 子句中的值列表進行比較。字元串是已知且離散的。IN 是否使用
=
運算符來比較值?b 樹索引是否適用於這個案例?範例查詢:create table fruit ( name character varying NOT null ) select * from fruit where name in ('Banana', 'Apple');
讓我們假設目前我們不想規範化數據(儘管我同意這是最有意義的)。
一個
IN
語句可以被認為是一個鍊式的OR
,例如WHERE name IN ('Banana','Apple')
等價於WHERE (name = 'Banana' OR name = 'Apple')
.一旦您將主鍵定義為主鍵,數據就會被規範化,
Name
因為在本範例中這將唯一標識水果。因此,如果這是您的主鍵,那麼將存在一個 B-tree,並且引擎會(通常)為您的查詢執行兩次搜尋:一次用於“Banana”,一次用於“Apple”。如果在 上有一個二級索引
Name
,引擎將(再次,通常)在該索引上執行兩次查找,並針對錶執行兩次查找。