Postgresql

使用 IN( 的值列表的字元串索引1,1,1,2):btree 索引會起作用嗎?

  • August 7, 2020

我們有一個查詢需要將一個值與 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,引擎將(再次,通常)在該索引上執行兩次查找,並針對錶執行兩次查找。

引用自:https://dba.stackexchange.com/questions/273412