Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Pengantar Indeks SQL

Dalam sistem basis data relasional, indeks basis data adalah alat yang sangat kuat untuk pengambilan data. Dalam panduan ini, Anda mempelajari tentang indeks unik, kunci utama, dan kunci utama komposit.

Apa yang dimaksud dengan Indeks Basis Data?

Sebuah Indeks Basis Data adalah objek struktur data yang terkait dengan tabel database. Ini digunakan untuk meningkatkan kecepatan kueri basis data (melalui SQL SELECT memerintah). Secara umum, ada metode yang terdefinisi dengan baik untuk memutuskan jenis indeks yang akan dibuat. Ini sebagian besar diatur oleh bagaimana tabel dalam database berhubungan satu sama lain dan bagaimana data diambil.

Mengapa Menggunakan Indeks?

Secara umum, query (atau pencarian) dalam tabel melalui SQL SELECT perintahnya berurutan. Pencarian berurutan membutuhkan mulai dari bagian atas tabel dan membaca setiap baris data hingga data yang diinginkan diambil. Ini sangat tidak efisien dan dapat menjadi operasi yang mahal dalam hal kecepatan.

Indeks, di sisi lain, menggunakan fungsi hash untuk menghitung nilai indeks. Ini menyediakan akses langsung ke baris (kunci) yang terpengaruh dalam indeks. Setelah baris (kunci) tersebut berada di indeks, catatan indeks memiliki penunjuk langsung ke baris tabel yang diperlukan dalam kueri. Pointer ini dibuat selama pembuatan indeks dan pemeliharaan indeks. Kecepatan pengambilan data saat menggunakan indeks meningkat sesuai urutan besarnya.

Anatomi Indeks Basis Data Unik

Tabel database dapat memiliki satu atau lebih indeks terkait. Indeks itu sendiri menyimpan nilai baris (kunci) dari satu atau lebih kolom dalam sebuah tabel. Ini juga memiliki pointer yang menunjuk ke baris tabel aktual yang berisi nilai-nilai kunci ini. Jumlah baris yang ditunjuk oleh kunci tertentu dalam indeks bergantung pada apakah indeks tersebut indeks unik atau indeks non-unik .

Seperti namanya, indeks unik berisi kunci yang menunjuk hanya satu baris data dalam tabel tertentu. Indeks unik memastikan bahwa setiap baris dalam tabel berisi nilai unik dalam kolom tabel terindeks yang ditentukan. Secara efektif, tidak ada dua baris yang dapat memiliki nilai identik dalam kolom yang diindeks. Selain itu, indeks unik dibuat pada kolom yang ditetapkan sebagai kunci utama untuk meja. Kunci utama didefinisikan sebagai satu atau lebih kolom yang secara unik mendefinisikan baris dalam tabel database.

Contoh di bawah ini menunjukkan bagaimana kunci utama dan indeks unik digunakan dalam SQL. Semua contoh menggunakan tabel bernama Student , dalam contoh database bernama exampledb . Untuk menambahkan data contoh gunakan perintah berikut:

INSERT INTO Student(SSNumber, LastName, FirstName)
  VALUES
(111111111, Smith, John),
(222222222, Jones, Mary),
(333333333, Hansen, Robert);

Lihat data yang disimpan di Student tabel:

SELECT * FROM Student;

Anda akan melihat output berikut:

+-----------+----------+-----------+
| SSNumber  | LastName | FirstName |
+-----------+----------+-----------+
| 111111111 | Smith    | John      |
| 222222222 | Jones    | Mary      |
| 333333333 | Hansen   | Robert    |
+-----------+----------+-----------+
Catatan Kecuali disebutkan sebaliknya, semua perintah dalam panduan ini bekerja dengan baik di kedua MySQL dan PostgreSQL database.

Kunci dan Indeks Utama Kolom Tunggal

Sebagai contoh, asumsikan bahwa sekolah melacak siswanya dalam tabel bernama Student . Tabel ini memiliki kolom terkait bernama Student , SSNumber , LastName , dan FirstName . Dari kolom ini, Student adalah kolom kunci utama karena secara unik mengidentifikasi setiap baris data di Student meja. Buat indeks unik (SSIndex ) pada SSNumber kolom, untuk memfasilitasi pengambilan data secara cepat dari tabel. Perintah SQL DDL berikut digunakan untuk melakukan kueri ini:

CREATE TABLE Student (SSNumber CHAR(9) NOT NULL,LastName VARCHAR(30) NOT NULL,FirstName VARCHAR(20) NOT NULL,PRIMARY KEY (SSNumber));

CREATE UNIQUE INDEX SSIndex ON Student (SSNumber);
Catatan Kedua perintah SQL di atas dibatasi oleh titik koma (;), yang kompatibel dengan sebagian besar sistem basis data relasional. SSNumber secara khusus ditunjuk sebagai kunci utama tabel.

SSIndex hanya berisi informasi yang secara unik mengidentifikasi data di setiap baris Student meja. Setiap baris SSIndex memiliki pointer ke baris yang sesuai di Student meja. Ini SSIndex index memungkinkan Anda menghindari pencarian data berurutan dalam tabel yang meningkatkan kinerja dengan meminimalkan waktu yang dibutuhkan untuk kueri.

Untuk menemukan informasi terkait untuk Robert Hansen melalui SSNumber mereka , gunakan perintah SQL yang disertakan di bawah ini. Perintah tidak hanya menghilangkan pencarian berurutan Student tabel tetapi juga menggunakan SSIndex untuk menyediakan akses langsung ke baris data yang diperlukan. Ini berdasarkan penggunaan fungsi hashing dan penunjuk indeks terkait.

SELECT * FROM Student WHERE SSNumber = 333333333;

Data yang dikembalikan harus sebagai berikut:

+-----------+----------+-----------+
| SSNumber  | LastName | FirstName |
+-----------+----------+-----------+
| 333333333 | Hansen   | Robert    |
+-----------+----------+-----------+

Kunci Utama dan Indeks Komposit Multi-Kolom

Contoh bagian ini menggunakan tiga tabel yang menyimpan data yang terkait dengan liga tenis. Ketiga tabel tersebut diberi nama Player , League , dan Membership . Seorang pemain dapat bermain di beberapa liga, dan tabel keanggotaan menyediakan asosiasi itu. Tiga tabel memiliki kolom berikut yang terkait dengannya:

Kolom Player tabel ditampilkan di bawah dengan PlayedID sebagai kunci utama.

+----------+-----------+-----------+
| PlayedID | LastName  | FirstName |
+----------+-----------+-----------+

Kolom League tabel ditampilkan di bawah dengan LeagueId sebagai kunci utama.

+----------+------------+------------+
| LeagueId | LeagueName | SkillLevel |
+----------+------------+------------+

Kolom Membership tabel ditampilkan di bawah

+----------+-----------+
| PlayedID | LeagueId  |
+----------+-----------+

Langkah-langkah di bawah ini menunjukkan cara membuat Player , League , dan Membership tabel.

  1. Dari Player tabel, PlayedID kolom secara unik mengidentifikasi setiap baris data. Buat Player tabel diikuti oleh indeks unik pada PlayerId kolom.

     CREATE TABLE Player (
       PlayedID INT NOT NULL,
       LastName VARCHAR(30) NOT NULL,
       FirstName VARCHAR(20) NOT NULL,
       PRIMARY KEY (PlayedID)
     );
    
     CREATE UNIQUE INDEX PlayerIndex ON Player (PlayedID);
    
  2. Dari League tabel, LeagueId kolom secara unik mengidentifikasi setiap baris data. Buat League tabel diikuti oleh indeks unik padaLeagueId kolom. Berikut adalah perintah SQL untuk melakukan operasi ini:

     CREATE TABLE League (
       LeagueId INT NOT NULL,
       LeagueName VARCHAR(50) NOT NULL,
       SkilLevel VARCHAR(20) NOT NULL,
       PRIMARY KEY (LeagueId)
     );
    
     CREATE UNIQUE INDEX LeagueIndex ON League (LeagueId);
    
  3. Dari Membership tabel, keduanya PlayedID dan LeagueId kolom secara unik mengidentifikasi setiap baris data; yang merupakan kunci primer komposit. Buat Membership tabel diikuti oleh indeks komposit unik pada PlayedID dan LeagueId kolom.

     CREATE TABLE Membership (
       PlayerId INT NOT NULL,
       LeagueId INT NOT NULL,
       PRIMARY KEY(PlayerId, LeagueId)
     );
    
     CREATE UNIQUE INDEX MembershipIndex ON Membership (PlayerId, LeagueId);
    

MembershipIndex adalah indeks yang dihasilkan hash yang terdiri dari Kunci Komposit(PlayedId dan LeagueId ). Ini memiliki pointer ke baris data yang diwakilinya. Penggunaan indeks semacam itu memfasilitasi pengambilan data akses langsung yang cepat, sebagai lawan dari pengambilan data sekuensial linier. Misalnya, untuk menentukan semua pemain yang terkait dengan “Ganda Putra” dari beberapa rekor di masing-masing tabel di atas, Anda dapat mengeluarkan perintah SQL berikut:

SELECT Player.LastName, Player.Firstname
FROM Player, Membership
WHERE Membership.LeagueId = 2
AND Membership.PlayerId = Player.PlayerId

Data berikut dikembalikan:

+----------+-----------+
| LastName | FirstName |
+----------+-----------+
| Smith    | John      |
| Hansen   | Robert    |
+-----------+----------+

Tanpa menggunakan MembershipIndex dan PlayerIndex , kueri di atas akan dieksekusi secara signifikan lebih lambat.

Indeks Non-Unik

Indeks non-unik berisi entri yang mungkin mengarah ke satu atau lebih baris untuk nilai kunci yang diberikan. Misalnya, untuk mencari berdasarkan nama seseorang, perlu membuat indeks komposit non-unik pada tabel untuk kedua FirstName dan LastName . Sejak kombinasi FirstName dan LastName tidak dapat dijamin unik, indeks yang dihasilkan yang dibuat pada dua kolom tersebut secara efektif menghasilkan indeks yang tidak unik.

Masalah Penurunan Kinerja Database Menggunakan Indeks

Sementara indeks membantu kecepatan eksekusi kueri, mereka perlu diperbarui setiap kali kolom yang diindeks berubah atau ketika baris tabel ditambahkan atau dihapus dari database. Ini dapat merusak kinerja database. Penting untuk mengingat jumlah penyisipan, penghapusan, dan modifikasi yang diperlukan dari indeks Anda selama penggunaan basis data transaksional. Pertimbangkan apa yang penting bagi Anda dalam aplikasi database; kecepatan eksekusi query atau kecepatan manipulasi data. Jawaban atas pertanyaan tersebut terletak pada bagaimana aplikasi database digunakan, seberapa sering hal itu mempengaruhi desain database, dan jumlah indeks yang dibuat.

Kesimpulan

Membuat dan menggunakan indeks basis data menghasilkan respons pengambilan kueri yang cepat dan menghilangkan pencarian baris berurutan dari tabel. Namun, pemeliharaan indeks melalui manipulasi data dapat memiliki dampak kinerja yang merugikan pada database. Perancang basis data perlu menyadari pertukaran yang terlibat saat menggunakan indeks basis data dan mengingat pengoptimalan untuk kinerja basis data secara keseluruhan.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ScaleGrid DBaaS Memperluas Layanan Hosting MySQL Melalui AWS Cloud

  2. mysqli masukkan id terakhir

  3. Bagaimana cara menginstal MySQL di CentOS 7

  4. Bagaimana saya bisa memperbaiki Kesalahan Pemuatan MySQL

  5. Bagaimana saya bisa menggunakan mysqli_fetch_array() dua kali?