انواع مدل ایندکس گذاری
B-tree
Hash
GiST (Generalized Inverted Search Tree)
SP-GiST (Spaced Partition GiST)
GIN (Generalized Inverted Index)
BRIN (Block Range Indexes)
در این مدل postgresSql یک درخت self-balanced ایجاد میکند. یعنی مرتب سازی انجام میدهد و قسمت مهم اینه که بالانس رو در طی عملیات های حذف سرچ یا وارد کردن داده حفظ میکند و باعث میشود سرعت عملیات اسکن افزایش یابد و علت ان این است که صفحات را بصورت خطی یا پشت سرهم اسکن نمیکنه. این روش زمانی خوب است که از اول جدول و فیلد هاشو داشته باشیم , طول فیلدها ثابت باشند , عملیات قرار است روی فیلد های زیادی اجرا بشود.
زمانی که از دستور create index استفاده میکنیم posgresSql به عنوان پیش فرض B-tree رو انتخاب میکند.
create index test3 on public.customers using btree (name asc nulls first)
سرعت lookup این مدل ایندکس خیلی سریع تر از B-Tree هست. ولی یه نکته منفی داره. اونم اینه که مورد استفاده اون محدود به عملگر = هست.
CREATE INDEX test4 ON public.customers USING HASH (email)
GiST
تو شرایطی که مقادیر ذخیره شده تو یه ستون overlap دارن ما از این مدل برای ایندکس گذاری استفاده می کنیم.
امکان اینکه ستونی با این ایندکس گذاری lossy هست. یعنی اینکه امکان برگشت مقادیر اشتباه هست ولی این به معنی خروجی اشتباه از کوئری نیست.فقط باید دیتابیس بیشتر عملیات انجام بده تا خروجی درستی داشته باشد.
create index test5 ON public.customers using gist(name)
SP-GiST
داده های که بالانس نیستن non-balance رو با درخت های partitioned search ایندکس گذاری میکنن.
GIN
توی این مدل ایندکس گذاری، به هر واژه یه ایندکس داده میشه. تو یه لیست فشرده ایندکس هایmatching location ها ذکر شده. این متد ایندکس گذاری برای زمانی خوب هست که ما مقادیر مختلفی تو یه ستون داریم. یعنی data type اون ستون معمولا یکی از موارد زیر هست:
JSONB
Array
Range Types
hStore
مورد کاربردش وقتی هست که دنبال یه text خاص تو یه مشته داکیومنت هستیم.
مثلا میخواهیم دنبال یک اسم مشتری تو جدول مشتریان باشیم و کاربر سه حرف اول رو وارد میکند و همه اون رکورد هایی که این سه کلمه را دارند برگردونده میشوند و نکته مهم این است که نوع ستون حتما باید از نوع tsvector باشند.
BRIN
در اکثر موارد به جای SP-GiST میتونیم از این مدل ایندکس گذاری استفاده بکنیم. بهره وری این مدل ایندکس گذاری تو مواردی که datasets زیادی داریم خیلی بیشتر هست. در ضمن هزینه maintenance این مدل ایندکس گذاری از B-Tree خیلی کمتره.کاربرد این مدل ایندکس گذاری تو مواردی هست که مثل zip code و date. چونکه میتونیم از دیتا های unnecessary صرف نظر بکنیم.
create index test5 on public.customers using brin(email)