Apa itu indeks dalam SQL?

440

Apa itu indeks dalam SQL? Bisakah Anda menjelaskan atau referensi untuk memahami dengan jelas?

Di mana saya harus menggunakan indeks?

Surya sasidhar
sumber

Jawaban:

377

Indeks digunakan untuk mempercepat pencarian di database. MySQL memiliki beberapa dokumentasi yang baik tentang masalah ini (yang juga relevan untuk server SQL lainnya): http://dev.mysql.com/doc/refman/5.0/id/mysql-indexes.html

Indeks dapat digunakan untuk secara efisien menemukan semua baris yang cocok dengan beberapa kolom dalam kueri Anda dan kemudian hanya menelusuri sebagian dari tabel untuk menemukan kecocokan yang tepat. Jika Anda tidak memiliki indeks pada kolom apa pun dalam WHEREklausa, SQLserver harus menelusuri seluruh tabel dan memeriksa setiap baris untuk melihat apakah cocok, yang mungkin merupakan operasi lambat pada tabel besar.

Indeks juga bisa berupa UNIQUEindeks, yang berarti bahwa Anda tidak dapat memiliki nilai duplikat di kolom itu, atau PRIMARY KEYyang di beberapa mesin penyimpanan menentukan di mana dalam file database nilai disimpan.

Di MySQL Anda dapat menggunakan EXPLAINdi depan SELECTpernyataan Anda untuk melihat apakah permintaan Anda akan menggunakan indeks apa pun. Ini adalah awal yang baik untuk memecahkan masalah kinerja. Baca lebih lanjut di sini: http://dev.mysql.com/doc/refman/5.0/id/explain.html

Emil Vikström
sumber
"Indeks juga bisa menjadi indeks UNIK ..." Hanya untuk mengonfirmasi dengan Anda, apakah itu berarti indeks dapat juga Non-UNIK? Saya selalu berpikir itu UNIK. Saya cukup baru untuk SQL, maafkan saya
Daniel Kurniadi
@DanielKurniadi Kebanyakan indeks tidak unik. Saya mungkin memiliki basis data pengguna dan ingin menanyakan semua orang yang tinggal di Gothenburg. Indeks pada bidang "kota" akan mempercepat kueri saya. Tetapi ada lebih dari 1 pengguna yang tinggal di Gothenburg sehingga indeksnya harus non-unik.
Emil Vikström
174

Indeks berkerumun seperti isi buku telepon. Anda dapat membuka buku di 'Hilditch, David' dan menemukan semua informasi untuk semua 'Hilditch tepat di sebelah satu sama lain. Di sini kunci untuk indeks berkerumun adalah (nama belakang, nama depan).

Ini membuat indeks berkerumun bagus untuk mengambil banyak data berdasarkan kueri berbasis rentang karena semua data terletak bersebelahan.

Karena indeks berkerumun sebenarnya terkait dengan bagaimana data disimpan, hanya ada satu dari mereka yang mungkin per tabel (meskipun Anda dapat menipu untuk mensimulasikan beberapa indeks berkerumun).

Indeks yang tidak berkerumun berbeda karena Anda dapat memiliki banyak dari mereka dan mereka kemudian menunjuk pada data dalam indeks berkerumun. Anda bisa memiliki misalnya indeks non-cluster di bagian belakang buku telepon yang dikunci (kota, alamat)

Bayangkan jika Anda harus mencari melalui buku telepon untuk semua orang yang tinggal di 'London' - dengan hanya indeks berkerumun Anda harus mencari setiap item dalam buku telepon karena kunci pada indeks berkerumun pada (nama belakang, nama depan) dan sebagai hasilnya orang-orang yang tinggal di London tersebar secara acak di seluruh indeks.

Jika Anda memiliki indeks non-cluster di (kota) maka pertanyaan ini dapat dilakukan jauh lebih cepat.

Semoga itu bisa membantu!

Dave Hilditch
sumber
151

Analogi yang sangat bagus adalah menganggap indeks basis data sebagai indeks dalam sebuah buku. Jika Anda memiliki buku tentang negara dan mencari India, lalu mengapa Anda harus membaca seluruh buku - yang setara dengan pemindaian tabel penuh dalam terminologi basis data - ketika Anda bisa langsung pergi ke indeks di bagian belakang buku buku, yang akan memberi tahu Anda halaman yang tepat di mana Anda dapat menemukan informasi tentang India. Demikian pula, karena indeks buku berisi nomor halaman, indeks database berisi pointer ke baris yang berisi nilai yang Anda cari dalam SQL Anda.

Lebih Banyak Di Sini

Arun Kumar M
sumber
2
Saya mengagumi orang-orang berpengalaman menjelaskan hal-hal dengan menggunakan "analogi". +1
snr
82

Indeks digunakan untuk mempercepat kinerja kueri. Ini dilakukan dengan mengurangi jumlah halaman data basis data yang harus dikunjungi / dipindai.

Dalam SQL Server, indeks berkerumun menentukan urutan fisik data dalam tabel. Hanya ada satu indeks berkerumun per tabel (indeks berkerumun IS tabel). Semua indeks lain pada tabel disebut non-cluster.

Mitch Wheat
sumber
49

Indeks adalah tentang menemukan data dengan cepat .

Indeks dalam database analog dengan indeks yang Anda temukan di buku. Jika sebuah buku memiliki indeks, dan saya meminta Anda untuk menemukan bab dalam buku itu, Anda dapat dengan cepat menemukannya dengan bantuan indeks. Di sisi lain, jika buku tidak memiliki indeks, Anda harus meluangkan lebih banyak waktu untuk mencari bab dengan melihat setiap halaman dari awal hingga akhir buku.

Dengan cara yang sama, indeks dalam database dapat membantu kueri menemukan data dengan cepat. Jika Anda baru diindeks, video berikut ini, bisa sangat berguna. Sebenarnya, saya telah belajar banyak dari mereka.

Dasar-Dasar Indeks Indeks
Berkelompok dan Tidak Berkelompok Indeks
Unik dan Tidak Unik
Keuntungan dan kerugian indeks

Suresh
sumber
Membaca semua jawaban membuat saya bertanya-tanya mengapa tidak mengindeks semuanya. +1 untuk menyertakan tautan yang mengandung kerugian.
Lakshay Garg
@LakshayGarg Terkadang pengindeksan yang tidak perlu juga dapat memperlambat waktu eksekusi kueri, jadi sebaiknya kita tidak mencoba mengindeks semuanya. Sama seperti semuanya memiliki pro dan kontra sendiri.
Gaurav Rajdeo
@LakshayGarg Gaurav Rajdeo benar. Jaga analogi yang sama: Anda mungkin ingin mengindeks setiap bab atau gambar atau tabel dalam sebuah buku tetapi tidak setiap paragraf, kalimat, atau kata. Biasanya, itu akan menjadi kerja keras dan akan menyebabkan komplikasi yang tidak perlu. Berharap ini cukup dekat dengan gambar yang diambil dalam jawaban ini.
colidyre
23

Nah secara umum indeksnya adalah a B-tree. Ada dua jenis indeks: berkerumun dan nonclustered.

Indeks berkerumun menciptakan urutan fisik baris (bisa hanya satu dan dalam kebanyakan kasus itu juga merupakan kunci utama - jika Anda membuat kunci utama pada tabel, Anda juga membuat indeks berkerumun di tabel ini).

Indeks nonclustered juga merupakan pohon biner tetapi tidak membuat urutan fisik baris. Jadi node daun indeks nonclustered mengandung PK (jika ada) atau indeks baris.

Indeks digunakan untuk meningkatkan kecepatan pencarian. Karena kerumitannya adalah O (log N). Indeks adalah topik yang sangat besar dan menarik. Saya dapat mengatakan bahwa membuat indeks pada basis data besar kadang-kadang semacam seni.

Suara
sumber
6
secara umum, ini adalah b-tree daripada pohon biner.
Mitch Wheat
jadi, karena indeks menggunakan pohon penyeimbang sendiri, setiap kali Anda menambah / menghapus baris, itu akan menyeimbangkan dirinya sendiri - membuat penyisipan / penghapusan lebih mahal ... benar?
David Refaeli
20

INDEXES - untuk menemukan data dengan mudah

UNIQUE INDEX - nilai duplikat tidak diizinkan

Sintaks untuk INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

Sintaks untuk UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
RAGU
sumber
13

Pertama, kita perlu memahami bagaimana kueri normal (tanpa pengindeksan) berjalan. Itu pada dasarnya melintasi setiap baris satu per satu dan ketika menemukan data itu kembali. Lihat gambar berikut. (Gambar ini telah diambil dari video ini .)

Tanpa pengindeksan Jadi misalkan kueri adalah untuk menemukan 50, itu harus membaca 49 catatan sebagai pencarian linear.

Lihat gambar berikut. (Gambar ini telah diambil dari video ini )

masukkan deskripsi gambar di sini

Ketika kami menerapkan pengindeksan, kueri akan dengan cepat menemukan data tanpa membaca masing-masing hanya dengan menghilangkan setengah dari data di setiap traversal seperti pencarian biner. Indeks mysql disimpan sebagai B-tree di mana semua data dalam node daun.

Kravi
sumber
12

INDEX adalah teknik pengoptimalan kinerja yang mempercepat proses pengambilan data. Ini adalah struktur data persisten yang terkait dengan Tabel (atau Tampilan) untuk meningkatkan kinerja selama mengambil data dari tabel itu (atau Tampilan).

Pencarian berbasis indeks diterapkan lebih khusus ketika permintaan Anda menyertakan filter WHERE. Kalau tidak, yaitu, kueri tanpa WHERE-filter memilih seluruh data dan proses. Mencari seluruh tabel tanpa INDEX disebut Table-scan.

Anda akan menemukan informasi yang tepat untuk Sql-Indexes dengan cara yang jelas dan andal: ikuti tautan ini:

  1. Untuk pemahaman cocnept-bijaksana: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. Untuk pemahaman implementasi-bijaksana: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html
nayeemDotNetAuthorities
sumber
6

Sebuah indeks digunakan untuk beberapa alasan yang berbeda. Alasan utamanya adalah untuk mempercepat permintaan agar Anda bisa mendapatkan baris atau mengurutkan baris lebih cepat. Alasan lain adalah untuk menentukan indeks kunci utama atau unik yang akan menjamin bahwa tidak ada kolom lain yang memiliki nilai yang sama.

Masuk akal
sumber
6

Jika Anda menggunakan SQL Server, salah satu sumber daya terbaik adalah Books Online sendiri yang dilengkapi dengan pemasangan! Ini adalah tempat pertama yang saya rujuk untuk topik apa pun yang terkait SQL Server.

Jika praktis "bagaimana saya harus melakukan ini?" semacam pertanyaan, maka StackOverflow akan menjadi tempat yang lebih baik untuk bertanya.

Juga, saya belum kembali untuk sementara waktu tetapi sqlservercentral.com digunakan untuk menjadi salah satu situs terkait SQL Server di luar sana.

cloneofsnake
sumber
0

Indeks adalah on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Indeks berisi kunci yang dibuat dari satu atau beberapa kolom dalam tabel atau tampilan. Kunci-kunci ini disimpan dalam struktur (B-tree) yang memungkinkan SQL Server untuk menemukan baris atau baris yang terkait dengan nilai-nilai kunci dengan cepat dan efisien.

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

Jika Anda mengkonfigurasi KUNCI UTAMA, Mesin Database secara otomatis membuat indeks berkerumun, kecuali indeks berkerumun sudah ada. Ketika Anda mencoba untuk menegakkan batasan PRIMARY KEY pada tabel yang ada dan indeks berkerumun sudah ada pada tabel itu, SQL Server memberlakukan kunci utama menggunakan indeks nonclustered.

Silakan lihat ini untuk informasi lebih lanjut tentang indeks (berkerumun dan tidak berkerumun): https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-description?view= sql-server-ver15

Semoga ini membantu!

adSad
sumber