7.1 Alasan munculnya indeks

Hal penting lainnya yang tanpanya tidak ada database adalah indeks.

Bayangkan sebuah situasi di mana ada 10 juta pengguna di tabel pengguna , dan Anda ingin menampilkan semua orang yang memiliki level di atas 90. Kueri ini sangat sederhana untuk ditulis:

SELECT * FROM user WHERE level > 90

Bagus, kami menulis permintaan dalam waktu kurang dari satu menit. Dan berapa lama untuk menjalankan kueri ini dari server SQL? Untuk menjalankan kueri seperti itu, dia harus melewati 10 juta catatan, dan bahkan jika hanya ada satu catatan, itu akan memakan banyak waktu.

Bagaimana kita melakukan tugas serupa di Jawa? Kami pertama-tama akan mengurutkan kumpulan pengguna berdasarkan level, dan kemudian kami dapat dengan cepat menemukan catatan yang diperlukan menggunakan pencarian biner. Saya harap saya tidak perlu menjelaskan apa itu?

Bagus, tetapi bagaimana jika sekarang kita harus memilih pengguna yang tanggal pendaftarannya sebelum tahun 2020? Urutkan lagi berdasarkan tanggal pendaftaran dan gunakan pencarian biner.

Ya, jika kita melakukan filter pada beberapa field, dan tidak hanya sekali, tapi sering, maka akan sangat berguna untuk menyimpan data yang diurutkan berdasarkan field tersebut.

Dan bagaimana cara menyimpan data yang diurutkan secara bersamaan berdasarkan bidang yang berbeda?

Dan jawabannya sangat sederhana - Anda tidak perlu menyimpan data itu sendiri, tetapi indeksnya di beberapa tabel global.

Katakanlah ada 10 pengguna dengan id: {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}.

Dan Anda memutuskan untuk mengurutkannya berdasarkan level, maka susunan id mereka akan menjadi, misalnya, seperti ini: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Dan jika kita mengurutkannya berdasarkan tanggal, maka kita dapatkan, misalnya: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Array dari id ini disebut indexes . Elemennya sendiri besar, kami tidak menyentuhnya. Di Java, kami tidak menyentuh objek, tetapi menyimpan referensinya; di SQL, kami tidak menyentuh string asli, tetapi menyimpan nomornya.

Biarkan saya menulis ulang ini dalam kode Java:

List<String> list = List.of("A", "C", "B", "Z", "Cc", "Bb", "Zz", "Y");  //this is a list of objects
List<String> alphabeticsList = new ArrayList(list);
Collections.sort(alphabeticsList); //collection sorted alphabetically

List<String> lengthList = new ArrayList(list);
Collections.sort(lengthList, lengthComparator); //collection sorted by string length

Menyortir koleksi tidak berarti memindahkan elemen yang sebenarnya. Koleksinya tidak menyimpan objek nyata, tetapi menautkannya. Hal yang sama berlaku untuk tabel SQL. Garis nyata membohongi diri mereka sendiri dan berbohong.

Dan ketika kita perlu sering membuat pilihan untuk beberapa bidang, maka kita menambahkan indeks lain ke tabel (analog dengan koleksi baru di Java) dan mengurutkan baris tabel, menyimpan urutannya dalam file indeks khusus.

Saya harap perbandingan Java sedikit membantu. Sedikit latihan - dan bagi Anda, penggunaan indeks juga akan menjadi solusi yang paling jelas.

7.2 Menambahkan indeks ke tabel

Indeks dapat ditentukan segera selama pembuatan tabel, atau ditambahkan setelahnya. Paling sering, ini adalah skenario kedua yang terjadi - indeks ditambahkan saat ukuran tabel bertambah dan pengambilan sampel data melambat.

Menambahkan indeks ke tabel sangat sederhana:

ALTER TABLE table
    ADD INDEX index_name (column);

Jika Anda sering mencari catatan dalam beberapa kolom secara bersamaan, Anda dapat menentukan indeks komposit: SQL menggunakan banyak kolom untuk menyusunnya.

Menambahkan indeks komposit ke tabel juga sangat sederhana:

ALTER TABLE table
    ADD INDEX index_name (column 1, column 2, column 3, ...);

Indeks memakan banyak ruang disk, jadi jika Anda tidak lagi memerlukan indeks, Anda selalu dapat menghapusnya:

ALTER TABLE table
    DROP INDEX index_name;

Indeks itu sendiri adalah bagian yang agak tersembunyi dari database. Mereka tidak memengaruhi format kueri penulisan dengan cara apa pun. Hanya saja kehadiran mereka mempercepat pengambilan sampel data dan memperlambat penambahan dan pencadangan mereka.

Tetapi mengingat betapa pentingnya kecepatan di dunia saat ini dan betapa murahnya ruang disk, jangan ragu untuk menambahkan indeks untuk semua kesempatan. Maafkan aku para admin...