Langkau ke kandungan utama

Panduan dan Tips Menetapkan Indeks pada Jadual MySQL

Indeks pada Jadual MySQL

MySQL akan membuat carian baris demi baris setiap kali kita membuat carian menggunakan arahan WHERE. Masa untuk carian ini akan menjadi lebih panjang setelah jadual kita menjadi semakin besar dan data semakin banyak.
Fungsi indeks digunakan untuk mengurangkan masa carian dan mengelakkan MySQL daripada membuat carian keseluruh baris dalam jadual (full table scan) kerana ianya akan memakan masa, memori dan pemprosesan yang tinggi.
Indeks akan mengambil data daripada kolum di jadual anda, menyusun semula mengikut susuan huruf atau nombor secara menaik mengikut jenis data.
MySQL akan membuat carian pada indeks terlebih dahulu, kemudian barulah ia mengambil baris yang spesifik pada jadual sebenar. Baris yang lain, diabaikan

Apa tujuan kita meletakkan indeks di jadual MySQL?

  • Carian lebih laju
  • Baris yang tidak berkenaan, diabaikan
  • Jika indeks ada banyak kolum, mana mana satu gabungan kolum dengan kolum pertama boleh dijadikan satu indeks.
  • Contoh:
indeks : | col a | col b | col c | col d |
1 : | col a | col b |
2 : | col a | col c |
3 : | col a | col d |
  • mySQL JOINS lebih cepat. Lebih efektif jika indeks pada kedua-dua jadual yang melakukan JOINS adalah daripada jenis dan saiz yang sama.
  • Pencarian MIN() dan MAX() sesuatu kolum yang lebih cepat menyusun (SORT) dan menumpulkan (GROUP) dengan lebih cepat

Bagaimana cara melakukan Indeks?

Yang ni aku akan unjuk berdasarkan contoh.
  • Jika anda menggunakan framework seperti laravel, django atau Ruby on Rails, sila ikuti panduan framework masing-masing untuk meletakkan indeks pada kolum.
Berikut adalah cara-cara dengan menggunakan pernyataan SQL
Katakan kita ada jadual Patients (pesakit):
Jadual patients:
idmrnfirst_namelast_namenrictown_id
1A219323AhmadAbu2011250365511
2A219324LisaIsmail3411250365512
3A219325KarenHart4411250365511
4A219326Ahmad KhairiJalil5411250365511
CREATE TABLE `patients` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `mrn` varchar(7) NOT NULL,
  `first_name` varchar(255) DEFAULT NULL,
  `last_name` varchar(255) DEFAULT NULL,
  `nric` varchar(15) NOT NULL,
  `town_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB
Sistem kita akan membuat carian ke atas jadual ini menggunakan SQL berikut:
  • carian pesakit menggunakan id
  • carian pesakit menggunakan mrn
  • carian pesakit menggunakan first_name
  • carian pesakit menggunakan nric
  • carian pesakit mengikut bandar (untuk statistik)
Setiap pernyataan SQL ini membuat carian menggunakan kolum tunggal, maka kita kena pastikan
 >  1. letak indeks pada kolum yang kita lakukan carian
Carian yang menggunakan kolum id tidak perlu dilakukan apa-apa tindakan kerana telah sebarang carian dengan kueri id = "nilai" adalah khusus kepada baris tersebut sahaja. Ini adalah cara membuat carian yang paling optimum dan terbaik.
Kolum kedua, ketiga, kelima dan keenam masih belum dikalifikasikan sebagai indeks.
Cara untuk menetapkan kolum tersebut sebagai indeks:
CREATE INDEX by_mrn ON patients (`mrn`);
CREATE INDEX by_first_name ON patients (`first_name`);
CREATE INDEX by_nric ON patients (`nric`);
CREATE INDEX by_town_id ON patients (`town_id`);
dengan ini, setiap carian yang menggunakan kolum tersebut akan menjadi lebih cepat dan efisyen.

Bagaimana pula dengan carian banyak kolum?

seperti contoh di atas tu, katakanlah sql nya macam ni:
select * from patients where first_name like ("Muhd%") and town_id = 1
Pernyataan tersebut akan menyenaraikan semua pesakit yang namanya bermula dengan Muhd dan tinggal di bandar 1, katakanlah town_id=1 adalah kota bharu.
Oleh kerana mungkin terdapat ramai pesakit yang bernama tersebut di Kota Bharu, maka carian ini akan menjadi perlahan. Oleh itu, kita boleh gabungkan beberapa kolum untuk menjadi indeks.
DROP INDEX by_town_id ON patients;
CREATE INDEX by_town_id_and_first_name ON patients (town_id, first_name);
atau
DROP INDEX by_first_name ON patients;
CREATE INDEX by_first_name_and_town_id ON patients (first_name, town_id);
Kita boleh buang indeks tunggal pada kolum town_id kerana sebarang indeks gabungan kolum akan turut berfungsi sebagai indek tunggal mengikut kolum yang paling kiri.
Kenapa kita tak buang indeks first_name? Kerana MySQL hanya akan mengenali indeks mengikut nama kolum yang pertama.
Jadi, indeks dibezakan mengikut nama kolum pertama. Jika anda ada banyak indeks pada jadual tapi indeks tersebut bermula dengan kolum yang sama, anda hanya perlu tinggalkan satu sahaja yang dapat merangkumi semua.

Jadual Terhubung (JOINS)

SELECT p.*, t.name
FROM `patients` p 
LEFT JOIN `towns` t on p.town_id = t.id
WHERE p.first_name like ("Ahmad%") and p.town_id = 2
oleh kerana kita telah membuat carian mengikut town_id dalam contoh sebelum ini, kita telahpun meletakkan indeks pada kolum tersebut.
Satu contoh lain penggunaan indeks adalah apabila kita menggabungkan carian dengan jadual lain menggunakan pernyataan JOINS
setiap kolum yang kita gunakan dalam carian JOINS perlulah diindekskan

Jadi, kolum mana biasanya kita indeks?

  1. Kolum yang menjadi rujukan kepada jadual lain (biasanya diakhiri oleh _id)
  2. kolum untuk carian seperti nama, nostaf, no pendaftaran, no kereta, no pelajar, nama jenama dll.
  3. mana-mana kolum yang digunakan dalam URL.

Peningkatan Prestasi Pangkalan Data apabila menggunakan indeks

  • menulis (write) menjadi lebih laju
  • carian lebih laju
  • join lebih laju
Sekian dahulu, semoga bermanfaat


Ulasan

Catatan popular daripada blog ini

Apa Maksud RON dalam pengkelasan Petrol?

RON dan Petrol Oleh yusdirman, Oktober 2014 RON adalah singkatan daripada Research Octane Number Ianya kaedah penarafan bahan api. Lebih tinggi nilai RON, lebih mahal harga PETROL. Adakah minyak RON 97 lebih berkuasa berbanding RON 95? RON merujuk kepada tahap bahan api menahan rintangan "ketukan" semasa proses pembakaran oleh palam pencucuh dalam enjin. Ianya merujuk kepada tahap ketahanan bahan api untuk tidak terbakar sebelum dinyalakan oleh palam pencucuh dalam enjin. "ketukan" dalam konteks RON ini adalah apabila campuran bahan api dan udara dalam enjin terbakar lebih awal sebelum api dari palam pencucuh menbakarnya. Pembakaran awal ini mungkin disebabkan enjin terlalu panas. Haba dari silinder enjin itu sendiri mungkin telah menyalakan bahan api sebelum palam pencucuh menyala. Ini boleh menurunkan prestasi dan mungkin boleh memudaratkan enjin! Jadi, RON bukannya bermaksud LEBIH KUASA! Ianya bermaksud bahan api itu dapat menahan tekanan dari

Load Balancing dengan Nginx dan Puma

Load Balancing dengan Nginx dan Puma Tutorial ini adalah sangat ringkas hanya untuk menunjukkan kebolehan nginx sebagai load balancer yang dapat menjadi 'orang tengah' antara banyak server di belakangnya Keperluan 1. Paling kurang 2 server aplikasi 2. Satu server diinstall nginx Contoh Persekitaran yang sekarang 1. server1: os: debian application: ruby on rails web server : puma dns : myaplication1.yusdirman.com 2. server2: myaplication2.yusdirman.com os:debian application: ruby on rails web server : puma dns : myaplication1.yusdirman.com 3. nginx diinstall di server1 /ets/nginx/nginx.conf setup (default): worker_processes  2; worker_processes  auto; worker_rlimit_nofile 65536; error_log  logs/error.log  notice; error_log  logs/error.log  info; events {   worker_connections  65536; } http {   include       mime.types;   default_type  application/octet-stream;   sendfile        on;   tcp_nopush on;   tcp_nodelay on;   keepalive_tim

Server Redundancy - Pertindanan Komputer Pelayan

alkisahnya tercari-cari untuk buat server redundancy ( pertindihan komputer pelayan ) atas sebab perlunya server yang sentiasa on-line tanpa ada downtime yang lama. Dan, cabarannya adalah memang kami tak pernah jalani apa-apa latihan, pengalaman dan apa jua pengetahuan berkenaan teknologi ini. Yang pastinya, perlu banyak mengoogle. Setakat ini, ada banyak kaedah untuk memastikan aplikasi masih terus boleh berfungsi walaupun server mati/rosak. 1. guna 2 server yang sama. Bila satu mati, satu lagi yang masih hidup dapat terus melayan pengguna. 2. guna 2 talian rangkaian yang berbeza. Bila satu talian rosak/putus, masih ada satu lagi talian rangkaian yang berfungsi. 3. storan di server guna raid ( redundant array of independent disk ) atau dalam bahasa melayu : barisan disk berlainan yang bertindan. Raid dapat menjadikan sebilangan hd menjadi 1 dengan semua data pada 1 hd adalah sama dengan data pada hd 2. (mirroring) 4. satu IP maya untuk sebilangan server. 2 server yang mena