MySQL adalah sebuah perangkat lunak sistem manajemen basis data SQL atau DBMS yang multialur, multipengguna dan banyak digunakan di seluruh dunia. Query adalah perintah yang digunakan untuk memanipulasi atau mendapatkan data dari basis data.
Daftar Isi
Tips Query MySQL
Programmer memiliki kebebasan dalam menarik data dari basisdata menggunakan Query. Terkadang ada idealisme hasil query yang diiinginkan tetapi tidak tahu bagaimana caranya karena tidak ada fasilitas bawaan yang disediakan, seperti crosstab, query cepat dan sebagainya.
— Tips Query MySQL
Tabel Sumber
CREATE TABLE `presensi_nama` (
`idpresensinama` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nama` varchar(45) DEFAULT NULL,
PRIMARY KEY (`idpresensinama`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
CREATE TABLE `presensi` (
`idpresensi` int(10) unsigned NOT NULL AUTO_INCREMENT,
`idpresensinama` int(10) unsigned DEFAULT NULL,
`tanggal` date DEFAULT NULL,
`hadir` tinyint(1) unsigned DEFAULT NULL,
PRIMARY KEY (`idpresensi`),
KEY `fk_idpresensinama_idx` (`idpresensinama`),
KEY `idx_tanggal` (`tanggal`),
CONSTRAINT `fk_idpresensinama` FOREIGN KEY (`idpresensinama`) REFERENCES `presensi_nama` (`idpresensinama`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
idpresensinama | nama |
---|---|
1 | John Doe |
2 | Fulan |
idpresensi | idpresensinama | tanggal | hadir |
---|---|---|---|
1 | 1 | 2022-01-02 | 1 |
2 | 2 | 2022-01-02 | 0 |
3 | 1 | 2022-01-03 | 1 |
4 | 2 | 2022-01-03 | 1 |
5 | 1 | 2022-01-04 | 1 |
6 | 2 | 2022-01-04 | 1 |
7 | 1 | 2022-01-05 | 1 |
MySQL
Crosstab Statis
|-Cara
menggunakan kondisi di dalam aggregate
|-Contoh
#alternatif 1
select nama, sum(if(hadir=1,1,0)) as `hadir`, sum(if(hadir=0,1,0)) as `tidak hadir` from presensi p join presensi_nama pn on pn.idpresensinama=p.idpresensinama group by p.idpresensinama;
#alternatif 2
select nama, sum(hadir=1) as `hadir`, sum(hadir=0) as `tidak hadir` from presensi p join presensi_nama pn on pn.idpresensinama=p.idpresensinama group by p.idpresensinama;
|-Hasil
nama | hadir | tidak hadir |
---|---|---|
John Doe | 4 | 0 |
Fulan | 2 | 1 |
Crosstab Dinamis
|-Cara
- Buat query crosstab statis; tandai query untuk crosstab
- Tandai field yang digunakan di dalam crosstab dan berada di tabel apa; kemudian diubah ke dalam bentuk group_concat
|-Contoh
#hasil akhir
select @crosstab := concat("select nama,", group_concat(distinct concat("sum(hadir=", hadir, ") as `hadir", hadir,"`") separator ","), " from presensi p join presensi_nama pn on pn.idpresensinama=p.idpresensinama group by p.idpresensinama") from presensi;
prepare rekap_presensi from @crosstab;
execute rekap_presensi;
deallocate prepare rekap_presensi;
Slow Query
|-Mitigasi
- Menggunakan klausa explain, atau
- Membaca log slow query, atau
- Monitoring koneksi
|-Kemungkinan Penyebab
- Penggunaan klausa where atau join tanpa melibatkan index [solusi: tambahkan index/unique/foreign key], atau
- Penggunaan klausa where yang tidak tepat pada sub query/aggregate [solusi: gunakan klausa where seawal mungkin (di dalam sub query), misalnya
select * from (select * from presensi where year(tanggal)=2022)
], atau - Penggunaan klausa in dengan sub query (misalnya
select * from presensi where idpresensinama in (select idpresensinama from presensinama where nama like '%fu%')
) [solusi: ubah ke dalam bentuk join, misalnyaselect * from presensi p join presensinama pn on pn.idpresensinama=p.idpresensinama where nama like '%fu%')
], atau - Menggunakan view yang berjenis undefine/temporary table [solusi: menghindari view yang berjenis undefine/temporary table], atau
- Penggunaan aggregate pada tabel yang besar [solusi: menggunakan fasilitas partition]
|-Contoh Mitigasi
- Contoh penggunaan klausa explain
explain select nama, sum(hadir=1) as hadir, sum(hadir=0) as tidak hadir from presensi p join presensi_nama pn on pn.idpresensinama=p.idpresensinama group by p.idpresensinama;
perhatikan informasi pada possible key dan extra; sebisa mungkin possible key tidak berisi null mysqldumpslow /var/log/mysql/mysql-slow.log
- Contoh monitoring koneksi untuk menemukan slow query dan solusinya
https://pdsi.unisayogya.ac.id/setting-moodle-untuk-administrator-atau-programmer/4#slow-query-moodle