$sql = "SELECT a.* , CONCAT(a.Kode_Barang,'<br><b>',b.Nm_Aset5,'</b>') as Nm_Aset5, CONCAT(a.latitude,'<br>',a.longitude) as latitude, c.Uraian as Kondisi from ta_kib_c as a left join ref_rek5_108 as b on CONCAT(a.Kd_Aset8,a.Kd_Aset80,a.Kd_Aset81,a.Kd_Aset82,a.Kd_Aset83,a.Kd_Aset84,a.Kd_Aset85)=CONCAT(b.Kd_Aset,b.Kd_Aset0,b.Kd_Aset1,b.Kd_Aset2,b.Kd_Aset3,b.Kd_Aset4,b.Kd_Aset5) LEFT JOIN ref_kondisi as c on a.Kondisi=c.Kd_Kondisi";
Dari query Anda, ada beberapa hal yang bikin lambat saat data ratusan ribu baris:
-
Pakai
SELECT a.*→ ini ambil semua kolom, padahal tidak semuanya dipakai. -
Pakai
CONCAT(...)diJOINdanWHERE→ ini bikin index di tabel tidak bisa dipakai (selalu full scan). -
Search
LIKE "%keyword%"ke semua kolom → ini berat sekali kalau tabel besar, apalagi tanpa index. -
Hitung total pakai query lengkap → harusnya cukup
COUNT(*)dengan kondisi filter.
✨ Perbaikan Step by Step
1. Pilih hanya kolom yang dipakai
Misalnya:
➡️ jangan SELECT a.*.
2. Hindari CONCAT() di JOIN
Anda punya ini:
⚡ Ini bikin MySQL tidak bisa pakai index.
Lebih cepat kalau dibandingkan per kolom:
3. Hindari CONCAT di filter OPD
Anda tulis:
Lebih cepat kalau pakai AND:
Kalau $a1 isinya gabungan, sebaiknya pecah dulu di PHP (substr atau explode) baru masukkan ke query.
4. Optimalkan search
Sekarang search Anda looping semua kolom:
➡️ ini berat kalau kolom banyak.
Solusi:
-
Batasi ke beberapa kolom penting (misalnya kode barang, nama aset, kondisi).
-
Gunakan
FULLTEXT INDEXkalau banyak teks.
Contoh:
5. Hitung total dengan COUNT(*)
Sekarang Anda pakai:
➡️ ini jalankan query penuh (dengan join dan limit hilang).
Lebih baik:
🚀 Contoh Query yang Lebih Cepat
⚡ Dengan ini:
-
Index bisa dipakai (JOIN & WHERE tidak pakai CONCAT).
-
Query count lebih ringan (
COUNT(*)). -
Search lebih efisien (hanya kolom penting).
Mau saya bikinkan versi full siap pakai (PHP lengkap dengan JSON response untuk DataTables) biar tinggal copy-paste ke load-data.php Anda?