Last chance! 50% off DataCamp Premium
Sale ends in
Sebagai data scientist, Anda sering kali harus menangani sejumlah besar data. Mengelola data (yang jumlahnya masif) sama sekali tidak mudah. Jadi, agar dapat menanganinya seefisien mungkin, Anda perlu memahami dengan jelas bagaimana data diorganisasi secara fisik sehingga Anda dapat memprosesnya dengan teknik yang tepat guna.
SQL adalah keterampilan wajib bagi setiap software engineer modern karena sebagian besar perangkat lunak bergantung pada suatu bentuk data dan terintegrasi baik dengan RDBMS (Relational Database Management System). Baik itu aplikasi web, API, maupun aplikasi internal, RDBMS selalu hadir. Dan SQL adalah bahasa untuk melakukan query pada RDBMS.
Sebagai data scientist, penting untuk mengetahui SQL dan teknik-teknik terkaitnya. Untuk bisa melakukan query pada RDBMS dan mendapatkan jawaban atas pertanyaan spesifik tentang data yang Anda tangani, SQL adalah kebutuhan minimum.
Dalam video terbarunya bersama DataCamp, David Robinson (Chief Data Scientist @ DataCamp) menunjukkan bagaimana ia menggunakan SQL dalam sebuah masalah Data Science. Silakan disimak. Alur kerjanya sangat menarik.
Hari ini Anda akan mempelajari teknik bernama Indexing yang terutama berkaitan dengan pengorganisasian data di dalam database, dan Anda akan mengimplementasikan sebagian di antaranya menggunakan SQL. Ini akan memberi Anda gambaran tentang bagaimana pengindeksan dapat digunakan untuk menyimpan informasi di dalam database dan bagaimana hal tersebut dapat menghasilkan waktu eksekusi yang lebih cepat.
Catatan: Sebelum mulai membaca tutorial ini, sangat disarankan untuk mempelajari dasar-dasar SQL jika Anda belum familiar. Kursus DataCamp Intro to SQL for Data Science adalah sumber yang sangat baik jika Anda ingin menyegarkan kembali dasar-dasar SQL.
Sebelum mempelajari apa pun tentang pengindeksan, sangat penting untuk memahami bagaimana data diorganisasi secara fisik di dalam berkas. Tentu saja, Anda tidak akan masuk ke semua detail, tetapi memiliki gambaran yang baik tentang organisasi akan membantu Anda memahami pengindeksan dengan sangat jelas. Mari mulai.
Organisasi rekaman/data secara umum membahas bagaimana rekaman disimpan dan secara garis besar dapat dibagi menjadi dua jenis:
Organisasi terurut: Semua rekaman dalam sebuah berkas diurutkan berdasarkan suatu nilai kunci pencarian. Pencarian biner umumnya digunakan untuk mencari nilai apa pun di dalam berkas terurut. Ini membuat pencarian sangat efisien karena kompleksitas waktunya berada pada waktu logaritmik. Namun penyisipan ke berkas menjadi operasi yang mahal karena Anda mungkin harus mengatur ulang seluruh berkas untuk menampung item baru.
Organisasi tidak terurut: Pada jenis ini, rekaman dimasukkan ke dalam berkas di mana pun ada tempat, biasanya di bagian akhir berkas. Karena pencarian linear digunakan untuk jenis ini, pencariannya tidak seefisien varian sebelumnya tetapi penyisipan bukan operasi yang mahal.
Walaupun Anda memiliki organisasi berkas yang terurut, bagaimana jika ukuran blok berkas dan ukuran setiap rekaman di dalam berkas sangat besar? Mari kita bahas di bagian berikutnya.
Anda akan memulai bagian ini dengan mempelajari motivasi di balik penggunaan pengindeksan untuk menyimpan berkas/informasi secara efisien dan bagaimana hal itu meningkatkan operasi lain yang terkait dengan berkas/informasi tersebut.
Anggap Anda memiliki sebuah tabel (relasi) yang berisi beberapa rekaman dalam sebuah database. Rekaman tersebut dibagi lagi menjadi 1000 blok. Secara visual, organisasinya tampak seperti berikut:

Dari organisasi di atas, jelas bahwa:
Ingat bahwa setiap rekaman juga berisi kolom-kolom lain, tetapi untuk organisasi ini, pengurutan diterapkan pada kolom pertama dan blok dibagi sesuai. Kini, jika Anda melakukan pencarian biner untuk mencari apa pun di dalam organisasi atau rekaman ini, total waktu yang dibutuhkan adalah $\log_{2}1000$ yang sama dengan 10 satuan waktu. Bisakah waktu pencarian ini ditingkatkan?
Tentu saja bisa.
Bayangkan ini seperti membaca buku tanpa halaman indeks. Anda membuka halaman acak (atau dalam kasus pencarian biner Anda membuka halaman tengah buku) dan membalik ke kiri dan kanan sesuai kebutuhan untuk menuju halaman yang Anda inginkan. Ini jelas memakan waktu. Bukan begitu?
Namun jika buku tersebut memiliki halaman indeks, pencarian tentu akan lebih efisien. Anda bisa langsung menuju halaman yang dimaksud hanya dengan melihat indeks. Anda dapat menerapkan pengindeksan dengan cara yang sama pada situasi di atas.
Berikut ringkasan bagaimana Anda dapat menerapkan pengindeksan di sini:
Ini akan menghasilkan jumlah blok yang lebih sedikit untuk menyimpan berkas data. Sekarang, untuk mencari rekaman tertentu, Anda hanya perlu mencari melalui organisasi baru yang terdiri dari lebih sedikit blok dan akhirnya Anda akan mendapatkan rekaman Anda (jika memang ada) dalam waktu yang jauh lebih singkat. Mari memvisualisasikannya. Dengan menganggap jumlah rekaman yang diindeks baru menghasilkan 8 blok, Anda akan mendapatkan organisasi seperti berikut:

Waktu pencarian akan berkurang drastis karena jumlah blok yang lebih sedikit. Misalnya, Anda ingin mencari rekaman 90. Dalam skema yang diindeks baru ini, pertama-tama Anda harus menemukan penunjuk bloknya yang dalam kasus ini adalah 3 dan kemudian menggunakan informasi ini Anda akan menemukan rekaman data asli hanya dalam satu kali akses.
Jadi, waktu pencarian dalam kasus ini adalah $\log_{2}8 + 1$ = 4 satuan waktu yang jauh lebih sedikit dibandingkan sebelumnya.
Contoh di atas memperkenalkan kebutuhan untuk melakukan pengindeksan. Berikut beberapa poin tentang pengindeksan yang patut dipertimbangkan:
Sekarang, berdasarkan pengurutan rekaman data asli dan berapa banyak rekaman yang akan Anda pertahankan dalam berkas indeks, ada banyak skema pengindeksan. Pada bagian berikutnya, Anda akan mempelajari yang paling populer.


Diagram di atas membuat kedua skema pengindeksan cukup mudah dipahami. Satu poin penting yang perlu dicatat adalah contoh sparse indexing di atas merupakan kombinasi dari dense dan sparse indexing. Itu karena untuk setiap nilai kunci pencarian yang unik (1, 2, dan 3) ada indeks, tetapi tidak setiap rekaman data memiliki indeks.
Sekarang Anda akan mempelajari jenis skema pengindeksan lainnya berdasarkan level rekaman. Dalam pengindeksan satu level, jumlah berkas indeks hanya satu. Namun, terkadang ukuran berkas indeks menjadi begitu besar sehingga berkas indeks itu sendiri diindeks. Dalam kasus itu, disebut pengindeksan multi-level. Mari selami lebih jauh.
Berikut gambaran strategi pengindeksan lebih lanjut yang dibuat berdasarkan pelapisan level.
Anda akan mempelajari semua strategi pengindeksan yang termasuk pengindeksan satu level. Di akhir tutorial ini, Anda akan mendapatkan tautan untuk mengeksplorasi skema pengindeksan multi-level jika Anda tertarik. Mari bahas Primary Indexing sekarang.
Primary index adalah berkas terurut yang rekamannya memiliki panjang tetap dengan dua field:
Indeks yang dibuat untuk rekaman pertama setiap blok disebut block anchors. Dalam primary indexing, jumlah entri indeks = jumlah blok data asli. Jumlah rata-rata akses blok menggunakan primary index adalah:
Lihat diagram berikut untuk memahaminya lebih jelas: 
Gambar paling kanan merujuk pada rekaman data asli yang dibagi ke beberapa blok. Perhatikan bahwa kolom yang berisi angka 1,2,3,...,9 adalah primary key. Gambar paling kiri merujuk pada entri terindeks di mana setiap entri terdiri dari:
Luangkan waktu sejenak dan pikirkan jenis pengindeksan apakah ini (Sparse atau Dense). Gunakan bagian comments untuk mengirimkan jawaban Anda.
Sekarang Anda akan mempelajari Clustering Indexing.
Clustering index dibuat pada berkas data yang rekamannya diurutkan secara fisik berdasarkan field non-key yang tidak memiliki nilai unik untuk setiap rekaman. Field ini disebut clustering field yang menjadi dasar dilakukannya pengindeksan. Karena itu namanya: clustering index.

Diagram selalu memudahkan pemahaman. Seperti yang Anda lihat, rekaman data asli diurutkan berdasarkan atribut non-key dan untuk setiap nilai unik dari atribut non-key, dibuat satu entri indeks. Jumlah rata-rata akses blok yang diperlukan untuk menemukan rekaman tertentu menggunakan skema ini adalah $\geq$ $\log_{2}B_i + 1$ , dengan $B_i$ adalah jumlah blok pada rekaman terindeks. Perhatikan tanda $\geq$ di sini.
Dalam clustering index, setelah menemukan blok tempat suatu kunci berada, Anda mungkin perlu menelusuri blok lain juga (yang cukup jelas dari gambar di atas).
Anda mungkin ingin memikirkan jenis pengindeksan apakah ini (Sparse atau Dense). Gunakan bagian komentar untuk mengirimkan jawaban Anda. Sekarang mari pelajari Secondary Indexing.
Misalkan Anda memiliki tabel bernama Employee di database Anda. Tabel tersebut memiliki atribut berikut:
employee_id adalah primary key-nya. Kini, Anda sudah membuat primary indexing pada tabel ini berdasarkan employee_id. Namun saat mengembangkan aplikasi, Anda mendapati bahwa sebagian besar query database menggunakan atribut employee_name. Dalam kasus itu, primary indexing tidak akan banyak membantu, dan merupakan praktik yang baik untuk memelihara pengindeksan terpisah untuk semua nilai milik employee_name. Bagaimanapun juga, nama karyawan tidak akan tersimpan dalam urutan terurut di dalam database. Jadi, mengindeksnya jelas akan mempercepat query yang melibatkan nama karyawan.
Ini adalah contoh klasik dari secondary indexing. Mari coba membuat ilustrasi yang sesuai untuk secondary indexing juga:

Silakan unggah representasi yang lebih baik di bagian comments jika Anda punya.
Sekarang Anda akan melihat bagaimana membuat indeks di PostgreSQL. Ikuti kursus DataCamp Joining Data in PostgreSQL jika Anda ingin mempelajari dasarnya.
Sebelum mulai membuat indeks di database PostgreSQL, Anda memerlukan data yang ada di sebuah tabel. Mari buat tabel sederhana bernama Student yang berisi rekaman berikut:
Anda akan menjadikan student_id sebagai primary key, dan Anda tidak akan mengizinkan nama mahasiswa dan tahun mahasiswa bernilai null.
Query untuk ini adalah sebagai berikut:
CREATE TABLE STUDENT(
student_id TEXT PRIMARY KEY,
student_name TEXT NOT NULL,
student_year TEXT NOT NULL
);
Setelah tabel berhasil dibuat, Anda harus memasukkan beberapa data yang sesuai ke dalam tabel. Untuk kemudahan, Anda dapat menggunakan .csv ini dan mengimpornya ke Student. Anda dapat mengimpor berkas .csv yang kompatibel ke tabel PostgreSQL menggunakan query berikut:
COPY STUDENT FROM '/path/to/csv/Student.csv' WITH (FORMAT csv);
Query di atas mengasumsikan bahwa nama berkas .csv yang datanya disalin adalah Student.
Mari lihat datanya sekarang. Menjalankan select * from STUDENT; mengembalikan rekaman berikut: 
Query select seharusnya mengembalikan total 86 rekaman. Sekarang Anda siap untuk membuat indeks. Anda dapat membuat indeks kolom tunggal menggunakan sintaks berikut:
CREATE INDEX index_name
ON table_name (column_name);
Mari buat indeks pada field student_id (primary indexing).
CREATE INDEX id_index
ON STUDENT (student_id);
Indeks multikolom juga dapat dibuat:
CREATE INDEX id_index
ON STUDENT (student_id,student_name);
Anda dapat menghapus indeks menggunakan sintaks berikut:
DROP INDEX index_name;
Cukup sulit merasakan dampak pengindeksan pada tabel kecil seperti STUDENT. Namun jika tabelnya besar (anggap tabel database yang berisi rekaman serupa dari sebuah universitas besar), pengindeksan jelas akan berperan penting.
Selamat sudah sampai di akhir. Dalam tutorial ini, Anda mempelajari tentang pengindeksan, kebutuhannya, dan berbagai skema pengindeksan. Anda juga melihat bagaimana melakukan pengindeksan sederhana di PostgreSQL.
Namun Anda belum mempelajari tentang pengindeksan multi-level dalam tutorial ini. Berikut beberapa sumber yang sangat baik jika Anda tertarik untuk mengeksplorasinya:
Namun apakah penggunaan pengindeksan selalu membantu? Ada beberapa kasus di mana penggunaan pengindeksan tidak disarankan.

Saya harap tutorial ini membantu Anda memahami dasar-dasar pengindeksan. Beri tahu saya temuan menarik Anda di bagian comments.
Lihat Learn SQL Hub dari DataCamp.
Pelajari lebih lanjut tentang SQL
{count, plural, one {Kursus} other {Kursus}}
{count, plural, one {blog} other {blogs}}
Dario Radečić
15 mnt
{count, plural, one {blog} other {blogs}}
David Woods
13 mnt
{count, plural, one {blog} other {blogs}}
Hugo Bowne-Anderson
13 mnt

{count, plural, one {blog} other {blogs}}
Javier Canales Luna
14 mnt