7.1 Sebab kemunculan indeks

Satu lagi perkara penting yang tanpanya tiada pangkalan data ialah indeks.

Bayangkan situasi di mana terdapat 10 juta pengguna dalam jadual pengguna dan anda mahu memaparkan semua orang yang mempunyai tahap melebihi 90. Pertanyaan ini sangat mudah untuk ditulis:

SELECT * FROM user WHERE level > 90

Hebat, kami menulis permintaan dalam masa kurang daripada seminit. Dan berapa lama masa yang diperlukan untuk melaksanakan pertanyaan ini daripada pelayan SQL? Untuk melaksanakan pertanyaan sedemikian, dia perlu melalui 10 juta rekod, dan walaupun hanya terdapat satu rekod, ia akan mengambil banyak masa.

Bagaimanakah kita akan melakukan tugas yang sama di Jawa? Kami mula-mula menyusun koleksi pengguna mengikut tahap, dan kemudian kami boleh mencari rekod yang diperlukan dengan cepat menggunakan carian binari. Saya harap saya tidak perlu menjelaskan apa itu?

Hebat, tetapi bagaimana jika kita kini perlu memilih pengguna yang tarikh pendaftarannya sebelum 2020? Isih sekali lagi mengikut tarikh pendaftaran dan gunakan carian binari.

Ya, jika kita melakukan penapisan pada beberapa medan, dan bukan hanya sekali, tetapi selalunya, maka ia akan menjadi sangat berguna untuk menyimpan data yang diisih mengikut medan ini.

Dan bagaimana untuk menyimpan data yang diisih serentak mengikut medan yang berbeza?

Dan jawapannya sangat mudah - anda tidak perlu menyimpan data itu sendiri, tetapi indeksnya dalam beberapa jadual global.

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

Dan anda memutuskan untuk mengisih mereka mengikut tahap, maka tatasusunan id mereka adalah, sebagai contoh, seperti ini: {9, 2, 3, 1, 5, 4, 8, 6, 7, 10}.

Dan jika kita menyusunnya mengikut tarikh, maka kita dapat, sebagai contoh: {10, 1, 8, 7, 2, 3, 5, 9, 6}.

Tatasusunan id ini dipanggil indeks . Unsur-unsur itu sendiri adalah besar, kita tidak menyentuhnya. Di Java, kami tidak menyentuh objek, tetapi menyimpan rujukannya; dalam SQL, kami tidak menyentuh rentetan sebenar, tetapi menyimpan nombornya.

Biar saya menulis semula ini dalam kod 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

Mengisih koleksi tidak bermakna memindahkan elemen sebenar. Koleksi itu tidak menyimpan objek sebenar, tetapi memautkannya. Perkara yang sama berlaku untuk jadual SQL. Garis sebenar berbohong kepada diri mereka sendiri dan berbohong.

Dan apabila kita perlu kerap membuat pilihan untuk beberapa medan, maka kita menambah indeks lain pada jadual (bersamaan dengan koleksi baharu di Jawa) dan mengisih baris jadual, menyimpan susunan diisihnya dalam fail indeks khas.

Saya harap perbandingan Java membantu sedikit. Sedikit latihan - dan untuk anda, penggunaan indeks juga akan menjadi penyelesaian yang paling jelas.

7.2 Menambah indeks pada jadual

Indeks boleh ditentukan serta-merta semasa penciptaan jadual, atau ditambah selepas. Selalunya, ini adalah senario kedua yang berlaku - indeks ditambah apabila saiz jadual berkembang dan pensampelan data menjadi perlahan.

Menambah indeks pada jadual adalah sangat mudah:

ALTER TABLE table
    ADD INDEX index_name (column);

Jika anda sering mencari rekod dalam berbilang lajur pada masa yang sama, anda boleh menentukan indeks komposit: SQL menggunakan berbilang lajur untuk mengarangnya.

Menambah indeks komposit pada jadual juga sangat mudah:

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

Indeks mengambil banyak ruang cakera, jadi jika anda tidak lagi memerlukan indeks, anda sentiasa boleh mengalih keluarnya:

ALTER TABLE table
    DROP INDEX index_name;

Indeks itu sendiri adalah bahagian yang agak tersembunyi dalam pangkalan data. Mereka tidak menjejaskan format penulisan pertanyaan dalam apa cara sekalipun. Cuma kehadiran mereka mempercepatkan pensampelan data dan memperlahankan penambahan dan sandaran mereka.

Tetapi memandangkan betapa pentingnya kelajuan dalam dunia hari ini dan betapa murahnya ruang cakera, jangan ragu untuk menambah indeks untuk semua keadaan. Maafkan saya admin...