80 / 100

CREATE INDEX

Indeks yaratish

Ushbu qo'llanmada PostgreSQLda jadvalning bitta yoki bir nechta ustunlari bo'yicha indeks yaratish uchun CREATE INDEX buyrug'idan qanday foydalanishni o'rganasiz.

PostgreSQL CREATE INDEX buyrug'iga kirish

CREATE INDEX buyrug'i ma'lumotlar bazasi jadvali ustunlarida qidiruvni tezlashtirish uchun yangi indeks yaratadi.

CREATE INDEX buyrug'ining asosiy sintaksisi:

query.sql
CREATE INDEX [IF NOT EXISTS] [index_name]
ON tablename (column1, column2, ...);

Sintaksis tushuntirishi:

  • index_name — yaratilayotgan indeksning nomi (ixtiyoriy). Agar nom ko'rsatilmasa, PostgreSQL avtomatik tarzda nom generatsiya qiladi.
  • IF NOT EXISTS — agar bunday nomli indeks mavjud bo'lsa, xatolik chiqarmasdan ogohlantirish berish uchun ishlatiladi.
  • tablename — indeks yaratilayotgan jadval nomi.
  • (column1, column2, ...) — indeks tarkibiga kiritiladigan ustunlar ro'yxati.

Indekslarni avtomatik nomlash qoidasi

Agar siz indeks nomini o'zingiz aniq ko'rsatmasangiz, PostgreSQL quyidagi andoza bo'yicha avtomatik nom beradi:

  • Bitta ustunli indeks uchun:
    matn
    tablename_column_idx
    
  • Ikki yoki undan ortiq ustunli (tarkibiy / composite) indeks uchun:
    matn
    tablename_column1_column2_idx
    

[!NOTE] Agar siz bir xil ustunlar to'plami uchun nom ko'rsatmasdan qayta-qayta CREATE INDEX qilsangiz, PostgreSQL har gal yangi nomli ortiqcha (dublikat) indekslar yaratishi mumkin. Shuning uchun indekslarga aniq nom berish yaxshi amaliyot hisoblanadi.

Namunaviy jadval

Misollarni bajarish uchun quyidagi transactions jadvalini yaratib olamiz:

query.sql
DROP TABLE IF EXISTS transactions;

CREATE TABLE transactions (
    transaction_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    customer_id INT NOT NULL,
    amount DECIMAL(10, 2) NOT NULL,
    type VARCHAR(50) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO transactions (customer_id, amount, type) VALUES
(1, 150.00, 'purchase'),
(2, 200.00, 'refund'),
(1, 50.00, 'purchase'),
(3, 400.00, 'transfer');

CREATE INDEX amaliy misollari

1) Bitta ustun bo'yicha indeks yaratish

transactions jadvalidagi type ustuni bo'yicha indeks yaratamiz:

query.sql
CREATE INDEX ON transactions(type);

Ushbu buyruq transactions_type_idx nomli yangi indeks yaratadi.

Jadvaldagi barcha indekslarni ko'rish uchun pg_indexes tizim katalogidan foydalanish mumkin:

query.sql
SELECT
  indexname,
  indexdef
FROM
  pg_indexes
WHERE
  tablename = 'transactions';

Natija:

matn
       indexname       |                                         indexdef                                          
-----------------------+-------------------------------------------------------------------------------------------
 transactions_pkey     | CREATE UNIQUE INDEX transactions_pkey ON public.transactions USING btree (transaction_id)
 transactions_type_idx | CREATE INDEX transactions_type_idx ON public.transactions USING btree (type)

Bu yerda:

  • transactions_pkey — birlamchi kalit (PRIMARY KEY) yaratilganda PostgreSQL tomonidan avtomatik yaratilgan noyob indeks.
  • transactions_type_idx — biz yaratgan indeks.

2) Bir nechta ustunli (Composite Index) indeks yaratish

Ko'pincha so'rovlar bir nechta ustunlar kombinatsiyasi bo'yicha filtrlanadi. Masalan, bir vaqtning o'zida customer_id va type bo'yicha:

query.sql
CREATE INDEX idx_transactions_customer_type 
ON transactions(customer_id, type);

Agar nom ko'rsatmasak:

query.sql
CREATE INDEX ON transactions(customer_id, type);

PostgreSQL unga transactions_customer_id_type_idx deb nom beradi.

Bunday tarkibiy indeks quyidagi holatlarda samarali ishlaydi:

  • Ham customer_id, ham type bo'yicha qidirilganda: WHERE customer_id = 1 AND type = 'purchase'
  • Faqat indeksning birinchi ustuni bo'yicha qidirilganda: WHERE customer_id = 1

Xulosa

  • CREATE INDEX buyrug'i jadval ustunlarida qidiruv va filtrlashni tezlashtirish uchun indeks yaratadi.
  • Agar nom ko'rsatilmasa, PostgreSQL jadval_ustun_idx ko'rinishida avtomatik nomlaydi.
  • Bir nechta ustunlar bo'yicha yaratilgan tarkibiy indekslar (composite indexes) murakkab WHERE shartlarida katta samaradorlik beradi.