Cara menggunakan mysql query result

Perbedaan antara SQL yang ditulis dengan baik dan tidak sangat luas, dan dalam produksi di situs dengan request yang tinggi menyebabkan dampak serius pada kinerja dan keandalan layanan. Dalam panduan ini saya akan membahas cara menulis kueri yang cepat dan faktor apa yang menyebabkannya berjalan lambat.

Mengapa MySQL?

Hari ini ada banyak pembicaraan tentang Big Data dan teknologi baru. NoSQL dan solusi berbasis cloud sangat bagus, tetapi banyak software web populer (seperti WordPress, phpBB, Drupal, software Forum VBulletin, dll.) yang masih berjalan di MySQL. Migrasi ke solusi baru ini mungkin tidak sesederhana hanya dengan mengoptimalkan konfigurasi yang sudah kamu miliki di produksi. Selain itu, kinerja MySQL sangat bagus, terutama versi Percona.

Jangan membuat kesalahan umum dengan membuang lebih banyak kekuatan komputasi saat berurusan dengan masalah kueri yang lambat dan beban server yang tinggi, daripada benar-benar mengatasi akar masalah yang mendasarinya. Menambahkan daya CPU, SSD, atau RAM adalah bentuk pengoptimalan jika kamu sukai, tetapi bukan itu yang akan saya bicarakan di sini. Selain itu, tanpa situs yang dioptimalkan, saat kamu tumbuh dengan perangkat keras, masalah akan berlipat ganda secara eksponensial. Jadi itu bukan solusi jangka panjang yang solid.

Menjadi baik di SQL selalu merupakan alat vital bagi pengembang web, dan dengan memperbaiki sering sesederhana hanya dengan menambahkan indeks atau sedikit memodifikasi cara tabel digunakan, itu benar-benar membantu untuk mengetahui cara menggunakan RDBMS-mu dengan baik. Dalam hal ini kita berfokus pada database open source yang sering digunakan bersama dengan PHP, dan itu adalah MySQL.

Untuk Siapa Panduan Ini?

Web Developer, Database Architect / DBA dan System Administrator yang terbiasa dengan MySQL. Jika kamu tidak terbiasa dengan MySQL sebagai pemula, maka panduan ini kemungkinan besar tidak akan masuk akal, tapi saya akan mencoba untuk tetap informatif sebisa mungkin untuk pendatang baru ke MySQL.

Backup Terlebih Dulu

Saya sarankan untuk mencoba langkah-langkah yang disediakan pada database MySQL-mu sendiri (backup semuanya terlebih dahulu!). Jika kamu tidak memiliki basis data untuk dikerjakan, contoh buat skema basis data yang disediakan jika berlaku.

Melakukan backup MySQL dapat dengan mudah melalui utilitas baris perintah

<?php
07:

1
$ mysqldump myTable > myTable-backup.sql

Kamu dapat mempelajari lebih lanjut tentang mysqldump.

Apa yang Membuat Kueri Lambat?

Secara singkat dan tanpa urutan kepentingan, berikut ini semua yang memainkan faktor penting dalam kinerja kueri dan server:

  • tabel indeks
  • klausa
    <?php
    
    08 (dan penggunaan fungsi internal MySQL seperti
    <?php
    
    09 dan
    <?php
    
    10 misalnya)
  • menyortir dengan
    <?php
    
    11
  • frekuensi permintaan secara bersamaan
  • tipe storage engine (InnoDB, MyISAM, Memory, Blackhole)
  • tidak menggunakan edisi Percona
  • variabel konfigurasi server (tuning my.cnf / my.ini)
  • set hasil yang besar (>1.000 baris)
  • koneksi yang tidak persisten
  • konfigurasi pemecahan / pengelompokkan
  • desain tabel yang buruk

Kita akan membahas semua area ini dalam panduan ini. Juga, jika kamu belum menggunakannya, silakan menginstal Percona, yang merupakan pengganti drop-in untuk MySQL yang akan membawa peningkatan kinerja yang serius. Untuk melihat tolok ukur Percona vs. MySQL, lihat perbandingan ini.

Apa Itu Indeks?

Indeks digunakan oleh MySQL untuk menemukan baris dengan nilai kolom tertentu dengan cepat, misalnya di dalam

<?php
12. Tanpa indeks, MySQL harus dimulai dengan baris pertama dan kemudian membaca seluruh tabel untuk menemukan baris yang relevan. Semakin besar tabel, semakin banyak biaya ini.

Jika tabel memiliki indeks untuk kolom yang dimaksud, MySQL dapat dengan cepat menentukan posisi untuk mencari di tengah file data tanpa harus melihat semua data. Ini jauh lebih cepat daripada membaca setiap baris secara berurutan.

Koneksi Yang Tidak Persisten?

Ketika bahasa scripting-mu terhubung dengan database, jika kamu telah mengkonfigurasi koneksi persisten maka ia akan dapat menggunakan kembali koneksi yang ada tanpa harus membuat yang baru. Ini optimal untuk penggunaan produksi dan harus diaktifkan.

Pengguna PHP dapat membaca lebih lanjut di PHP Manual.

Mengurangi Frekuensi Permintaan Secara Bersamaan

Cara tercepat dan paling efektif yang saya temukan untuk memperbaikinya adalah dengan memanfaatkan sepasang pasangan nilai-kunci seperti

<?php
13 atau
<?php
14.

Dengan

<?php
15 kamu dapat dengan mudah menyimpan konten kuerimu dengan yang berikut, misalnya:

1
<?php
2
$cache = new Memcache;
3
$cache->connect('localhost',11211);
4
$cacheResult = $cache->get('key-name');
$ mysqldump myTable > myTable-backup.sql
0
$ mysqldump myTable > myTable-backup.sql
1
$ mysqldump myTable > myTable-backup.sql
2
$ mysqldump myTable > myTable-backup.sql
3
$ mysqldump myTable > myTable-backup.sql
4
$ mysqldump myTable > myTable-backup.sql
5
$ mysqldump myTable > myTable-backup.sql
6
$ mysqldump myTable > myTable-backup.sql
7
$ mysqldump myTable > myTable-backup.sql
8
$ mysqldump myTable > myTable-backup.sql
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
1
7
1
8
1
9
<?php
0
<?php
1
<?php
2
<?php
3
<?php
4
<?php
5
<?php
6
<?php
7
<?php
8
<?php
9
2
0
2
1

Sekarang contoh kueri

<?php
16 hanya akan berjalan sekali setiap 86.400 detik (24 jam), sehingga mengambil sejumlah besar beban jauh dari server MySQL dan mengurangi koneksi secara bersamaan.

Catatan: Tambahkan

<?php
17 ke argumen host-mu di MySQLi untuk koneksi persisten.

Pemecahan / Pengelompokkan

Ketika datamu menjadi besar atau permintaan untuk layananmu meningkat, kepanikan dapat diatur. Perbaikan cepat untuk memastikan layananmu tetap online dapat menjadi pemecahan. Tapi saya tidak merekomendasikan itu, karena pemecahan secara inheren tampaknya membuat struktur data terlalu rumit. Dan seperti yang dijelaskan dengan sangat fasih dalam artikel ini dari blog Percona, jangan memecah.

Desain Tabel Yang Buruk

Membuat skema basis data tidak terlalu sulit ketika kamu menerima beberapa aturan yang sangat baik, seperti bekerja dengan batasan dan menyadari apa yang akan efisien. Menyimpan gambar dalam database sebagai tipe data

<?php
18, misalnya, sangat tidak disarankan; menyimpan nama file dalam kolom dengan tipe data 
<?php
19 jauh lebih unggul.

Memaastikan bahwa desainnya benar untuk penggunaan yang diperlukan sangat penting dalam membuat aplikasimu. Tetap memisahkan data tertentu (misalnya kategori dan pos) dan memastikan hubungan many-to-one atau one-to-many dapat dengan mudah dikaitkan dengan ID. Memanfaatkan fasilitas

<?php
20 dari MySQL sangat ideal untuk menurunkan kebimbangan data antar tabel.

Saat membangun tabelmu, coba ingat yang berikut:

  • Gunakan minimum yang kamu butuhkan untuk menyelesaikan pekerjaan; menjadi tipis dan langsung ke point-nya.
  • Jangan berharap MySQL untuk melakukan logika bisnismu atau menjadi terprogram—yang harus dilakukan benar-benar sebelum penyisipan oleh bahasa scripting-mu. Misalnya, jika kamu perlu mengacak daftar, lakukan pengacakan array dalam PHP, bukan dalam
    <?php
    
    21 di MySQL.
  • Gunakan jenis indeks
    <?php
    
    22 untuk dataset unik dan gunakan
    <?php
    
    23 untuk menyimpan datetime atau unix timestamp  yang diperbarui misalnya saat terakhir kali barisnya diperiksa.
  • Gunakan tipe data
    <?php
    
    24 untuk bilangan bulat numerik. Jika kamu tidak menentukan panjangnya, MySQL akan menghitung apa yang diperlukan itu sendiri.

Dasar-dasar Optimasi

Agar dapat mengoptimalkan secara efektif, kita harus melihat tiga kumpulan data mendasar terkait aplikasimu:

  1. Analisis (pencatatan log kueri yang lambat, pemeriksaan, dan analisa desain tabel)
  2. Persyaratan kinerja (berapa banyak pengguna, apa permintaannya)
  3. Kendala teknologi (kecepatan perangkat keras, meminta terlalu banyak MySQL)

Analisis dapat dilakukan dengan beberapa cara. Pertama-tama, kita akan mengambil rute yang paling langsung untuk mencari di bawah kapak kueri MySQL. Tool pertama dalam toolbox optimasimu adalah

<?php
25. Memanfaatkan ini dalam kuerimu sebelum
<?php
26 akan memberimu output berikut:

1
2
3
2
2
5
3
2
7
4
2
5
$ mysqldump myTable > myTable-backup.sql
0
$cache = new Memcache;
1
$ mysqldump myTable > myTable-backup.sql
2
2
5
$ mysqldump myTable > myTable-backup.sql
4
$cache = new Memcache;
5

Kolom yang tercantum masing-masing menyimpan informasi yang berguna tentang kueri yang sedang dijalankan. Kolom yang perlu kamu perhatikan adalah

<?php
27 dan
<?php
28.

<?php
27 akan menampilkan indeks yang engine MySQL telah sediakan untuk digunakan pada query. Terkadang kamu perlu memaksa indeks untuk memastikan kueri dijalankan dengan cara tercepat.

Kolom

<?php
28 akan menunjukkan apakah
<?php
12 atau
<?php
21 bersyarat digunakan. Yang paling penting untuk diperhatikan adalah jika
<?php
33 muncul. Perhatikan contoh berikut:

1
$cache = new Memcache;
7
2
$cache = new Memcache;
9
3
3
1
4
3
3
$ mysqldump myTable > myTable-backup.sql
0
3
5
$ mysqldump myTable > myTable-backup.sql
2
3
7
$ mysqldump myTable > myTable-backup.sql
4
3
9
$ mysqldump myTable > myTable-backup.sql
6
$cache->connect('localhost',11211);
1
$ mysqldump myTable > myTable-backup.sql
8
$cache->connect('localhost',11211);
3
1
0
$cache->connect('localhost',11211);
5
1
2
$cache->connect('localhost',11211);
7
1
4
$cache->connect('localhost',11211);
9

Jenis kueri ini bisa masuk ke disk karena ada kondisi di mana, yang terjadi jika kita melihat pada

<?php
25:

1
4
1
2
4
3

Jadi kueri ini memiliki kemungkinan untuk menggunakan dua indeks dan saat ini sedang memukul disk karena

<?php
35 di
<?php
28.

Apa yang

<?php
37 lakukan didefinisikan di sini dari manual MySQL:

"MySQL harus melakukan terusan tambahan untuk mencari tahu cara mengambil baris dalam urutan yang diurutkan. Semacam ini dilakukan dengan melalui semua baris sesuai dengan tipe join dan menyimpan kunci sortir dan pointer ke baris untuk semua baris yang sesuai dengan klausa WHERE. Tombol-tombol itu kemudian diurutkan dan baris-baris itu diambil dalam urutan yang terurut."

Terusan ekstra ini akan memperlambat aplikasimu dan harus dihindari di semua biaya. Hasil

<?php
28 penting lainnya yang harus dihindari adalah
<?php
39, yang berarti MySQL harus membuat tabel sementara untuk kueri. Tentunya ini adalah penggunaan MySQL yang mengerikan dan harus dihindari dengan segala cara kecuali kamu tidak dapat mengoptimalkan lebih lanjut karena persyaratan data. Dalam hal ini kuerinya harus di-cache dalam Redis atau Memcache dan tidak dijalankan oleh pengguna.

Untuk memperbaiki masalah dengan

<?php
33 kita harus memastikan MySQL menggunakan
<?php
41. Ini memiliki beberapa
<?php
27 untuk dipilih, tetapi MySQL hanya dapat menggunakan satu indeks dalam kueri akhir. Meskipun Indeks dapat berupa gabungan beberapa kolom, kebalikannya tidak benar, meskipun kamu dapat memberikan petunjuk kepada pengoptimal MySQL mengenai indeks mana yang telah kamu buat.

Indeks Petunjuk

Pengoptimal MySQL akan menggunakan statistik berdasarkan tabel kueri untuk memilih indeks terbaik pada cakupan kueri. Ia melakukannya berdasarkan logika statistik pengoptimalnya yang ada di dalamnya, meskipun dengan beberapa pilihan ini tidak selalu benar tanpa memberi petunjuk. Untuk memastikan kunci yang benar digunakan (atau tidak digunakan), gunakan kata kunci

<?php
43,
<?php
44 dan
<?php
45 dalam kuerimu. Kamu dapat membaca lebih lanjut tentang petunjuk indeks di manual MySQL.

Untuk melihat kunci-kunci tabel, gunakan perintah

<?php
46.

Kamu dapat menentukan beberapa petunjuk untuk pengoptimal agar digunakan, misalnya:

1
4
5
2
4
7
3
4
9
4
$cacheResult = $cache->get('key-name');
1
$ mysqldump myTable > myTable-backup.sql
0
$cacheResult = $cache->get('key-name');
3
$ mysqldump myTable > myTable-backup.sql
2
$cacheResult = $cache->get('key-name');
5
$ mysqldump myTable > myTable-backup.sql
4
$cacheResult = $cache->get('key-name');
7
$ mysqldump myTable > myTable-backup.sql
6
$cache = new Memcache;
7
$ mysqldump myTable > myTable-backup.sql
8
$ mysqldump myTable > myTable-backup.sql
01
1
0
3
1
1
2
3
3
1
4
3
5
1
6
3
7
1
8
3
9
<?php
0
$cache->connect('localhost',11211);
1
<?php
2
$cache->connect('localhost',11211);
3
<?php
4
$cache->connect('localhost',11211);
5
<?php
5
$cache->connect('localhost',11211);
7
<?php
7
$cache->connect('localhost',11211);
9

Sekarang MySQL memiliki

<?php
47 dari tabel untuk digunakan, kueri itu tetap.

1
4
1
2
$ mysqldump myTable > myTable-backup.sql
25

Bersama menjelaskan adalah kata kunci yang menggambarkan. Dengan

<?php
48 kamu dapat melihat informasi tabel sebagai berikut:

1
$ mysqldump myTable > myTable-backup.sql
27
2
$ mysqldump myTable > myTable-backup.sql
29
3
$ mysqldump myTable > myTable-backup.sql
31
4
$ mysqldump myTable > myTable-backup.sql
29
$ mysqldump myTable > myTable-backup.sql
0
$ mysqldump myTable > myTable-backup.sql
35
$ mysqldump myTable > myTable-backup.sql
2
$ mysqldump myTable > myTable-backup.sql
37
$ mysqldump myTable > myTable-backup.sql
4
$ mysqldump myTable > myTable-backup.sql
39
$ mysqldump myTable > myTable-backup.sql
6
$ mysqldump myTable > myTable-backup.sql
41
$ mysqldump myTable > myTable-backup.sql
8
$ mysqldump myTable > myTable-backup.sql
43
1
0
$ mysqldump myTable > myTable-backup.sql
29

Menambahkan Indeks

Kamu membuat indeks di MySQL dengan sintaks

<?php
49. Ada beberapa rasa dari indeks.
<?php
50 digunakan untuk pencarian teks lengkap, dan kemudian ada jenis
<?php
22 untuk memastikan data tetap unik.

Untuk menambahkan indeks ke tabelmu, gunakan sintaks berikut ini misalnya:

1
$ mysqldump myTable > myTable-backup.sql
47

Ini akan membuat indeks pada tabel

<?php
52, yang akan menggunakan 10 huruf pertama dari kolom username, yang merupakan tipe data varchar.

Dalam hal ini, pencarian apa pun yang membutuhkan

<?php
12 pada nama pengguna dengan kecocokan yang berada di 10 karakter pertama akan sama dengan pencarian seluruh tabel.

Indeks Komposit

Indeks memiliki efek besar pada kecepatan yang diperlukan untuk mengembalikan data kueri. Hanya menetapkan primary key dan indeks unique umumnya tidak cukup—kunci komposit adalah tempat di mana tuning reluk yang sebenarnya terletak di MySQL, dan paling sering ini memerlukan beberapa pemeriksaan A/B dengan

<?php
25.

Sebagai contoh, jika kita perlu mereferensikan dua kolom di dalam

<?php
12 kita bersyarat, kunci komposit akan ideal.

1
$ mysqldump myTable > myTable-backup.sql
49

Di sini kunci ini dibuat pada kolom

<?php
56 dari contoh sebelumnya dan kolom
<?php
57, tipe data
<?php
58 yang menandakan apakah akun penggunanya aktif. Jadi sekarang ketika kueri data untuk
<?php
12 username valid dan akun
<?php
60, dataset sekarang dioptimalkan untuk menangani ini lebih baik.

Seberapa Cepatkah MySQL Mu?

Aktifkan profiling untuk melihat lebih dekat pada query MySQL-mu. Ini dapat dilakukan pada waktu proses melalui 

<?php
61, dan kemudian mengeksekusi kuerimu dan melihat hasil dari 
<?php
62.

Dengan PDO, ini adalah cuplikan kode yang tidak hanya itu:

1
$ mysqldump myTable > myTable-backup.sql
51
2
$ mysqldump myTable > myTable-backup.sql
53
3
$ mysqldump myTable > myTable-backup.sql
55
4
$ mysqldump myTable > myTable-backup.sql
57
$ mysqldump myTable > myTable-backup.sql
0
$ mysqldump myTable > myTable-backup.sql
2
$ mysqldump myTable > myTable-backup.sql
60
$ mysqldump myTable > myTable-backup.sql
4
$ mysqldump myTable > myTable-backup.sql
6
$ mysqldump myTable > myTable-backup.sql
63

Jika kamu tidak menggunakan PDO, hal yang sama dapat dilakukan dengan

<?php
63 sebagai berikut:

1
$ mysqldump myTable > myTable-backup.sql
65
2
3
$ mysqldump myTable > myTable-backup.sql
68
4
$ mysqldump myTable > myTable-backup.sql
53
$ mysqldump myTable > myTable-backup.sql
0
$ mysqldump myTable > myTable-backup.sql
72
$ mysqldump myTable > myTable-backup.sql
2
$ mysqldump myTable > myTable-backup.sql
74
$ mysqldump myTable > myTable-backup.sql
4
$ mysqldump myTable > myTable-backup.sql
76
$ mysqldump myTable > myTable-backup.sql
6
$ mysqldump myTable > myTable-backup.sql
78
$ mysqldump myTable > myTable-backup.sql
8
$ mysqldump myTable > myTable-backup.sql
80
1
0
<?php
3
1
2
1
4
$ mysqldump myTable > myTable-backup.sql
85
1
6
$ mysqldump myTable > myTable-backup.sql
74
1
8
$ mysqldump myTable > myTable-backup.sql
76
<?php
0
$ mysqldump myTable > myTable-backup.sql
78
<?php
2
$ mysqldump myTable > myTable-backup.sql
80
<?php
4
<?php
3
<?php
5
<?php
7
$ mysqldump myTable > myTable-backup.sql
98

Ini akan mengembalikan kepadamu data profil, yang akan mencakup waktu eksekusi dalam nilai kedua dari array asosiatif:

1
1
00
2
1
02
3
1
04
4
1
06
$ mysqldump myTable > myTable-backup.sql
0
$ mysqldump myTable > myTable-backup.sql
78

Kueri membutuhkan waktu 0.00024300 detik untuk dapat selesai. Itu cukup cepat untuk tidak perlu khawatir. Tetapi ketika jumlah meningkat, kita harus melihat lebih dalam.

Sebagai contoh kerja, kenali aplikasimu. Tempatkan cek untuk konstanta

<?php
64 di basis data aplikasi database abstraction layer / framework database driver, dan kemudian kamu dapat mulai mengaudit dengan mengaktifkan kasus profil dan mengeluarkan hasilnya dengan
<?php
65 /
<?php
66. Sekarang kamu akan dapat menjelajahi dan membuat profil halaman situs web-mu dengan mudah!

Sepenuhnya Mengaudit Aplikasimu

Untuk melakukan audit penuh atas kuerimu, aktifkan pencatatan log. Beberapa pengembang saya telah bekerja dengan khawatir bahwa ini adalah masalah dua sisi yang memungkinkan pencatatan log sedikit mempengaruhi kinerja, dan statistik yang kamu rekam akan sedikit lebih rendah daripada dalam kenyataan. Meskipun ini benar, banyak patokan menunjukkan itu tidak terlalu banyak perbedaan.

Untuk mengaktifkan logging di MySQL versi 5.1.6, kamu menggunakan global

<?php
67 dan dapat menentukan file dengan global 
<?php
68. Ini dapat dilakukan dalam prompt runtime sebagai berikut:

1
1
10
2
1
12

Kamu dapat mengatur ini secara tetap di file konfigurasi

<?php
69 atau
<?php
70 untuk server-mu.

1
1
14
2
1
16

Setelah melakukan perubahan ini, kamu harus me-restart server MySQL, misalnya.

<?php
71 pada sistem Linux.

Di MySQL 5.6.1 yang lebih baru,

<?php
67 tidak digunakan lagi dan
<?php
73 digunakan sebagai gantinya. Mengaktifkan
<?php
74 sebagai tipe output memungkinkan pengalaman debugging yang jauh lebih baik dan dapat dilakukan sebagai berikut di MySQL 5.6.1 dan yang lebih baru:

1
1
18
2
1
20
3
1
22

<?php
75 menentukan jumlah detik kueri yang lambat agar diklasifikasikan. Standarnya adalah 10 dan minimum 0. Ini dapat mengambil nilai milidetik dengan menentukan float; di sini saya telah mengaturnya menjadi 1 detik. Jadi, setiap kueri yang membutuhkan waktu lebih lama dari 1 detik akan dicatat dalam format output
<?php
76.

Ini akan masuk ke tabel

<?php
77 dan
<?php
78 dalam
<?php
79.

Untuk menonaktifkan pencatatan log, set

<?php
80 ke
<?php
81.

<?php
82 adalah boolean yang berguna, ketika diaktifkan bersama dengan log kueri yang lambat, berarti hanya query yang diharapkan untuk mengambil semua baris yang dicatat.

Pilihan ini tidak selalu berarti tidak ada indeks yang digunakan. Misalnya, saat kueri menggunakan pemindaian indeks lengkap, ini akan dicatat karena indeks tidak akan membatasi jumlah baris.

Pencatatan Log di Produksi?

Mengaktifkan pencatatan di situs produksi dengan lalu lintas akan cukup banyak harus dilakukan dalam waktu singkat, sambil memantau beban untuk memastikannya tidak memengaruhi layanan. Jika kamu berada di bawah beban berat dan memerlukan perbaikan mendesak, mulailah dengan mengatasi masalah pada prompt dengan

<?php
83 atau melalui tabel
<?php
84 secara langsung, misal.
<?php
85.

Mencatat semua kueri dalam produksi dapat memberitahumu banyak hal dan merupakan praktik yang baik untuk tujuan penelitian ketika kamu mengaudit proyek, tetapi membiarkannya berjalan dengan sering selama berhari-hari tidak akan memberimu data yang lebih bermanfaat daripada paling lama 48 jam ( rata-rata, paling tidak menangkap waktu puncak penggunaan agar dapat melihat dengan baik kuerinya dan mendapatkan beberapa ide frekuensi).

Catatan: jika kamu menjalankan situs yang mengalami lonjakan lalu lintas puncak dan kemudian periode tidak banyak sama sekali (seperti situs web olahraga selama dan di luar musim), logislah dengan caramu melihat pencatatan log. Jangan anggap situs ini bekerja dengan cepat. Lakukan audit dan yang paling penting mengatur beberapa grafik.

Logging dan Percona’s pt-query-digest

Percona memiliki beberapa tool hebat yang digabungkan dengannya, dan

<?php
86 adalah tool baris perintah untuk menganalisis log kueri, daftar proses atau tcpdumps.

Kamu dapat menggunakan

<?php
86 dengan cara-cara berikut:

Menganalisis file *.log (dikeluarkan dari pencatatan log kuerimu yang lambat misalnya):

1
1
24

Laporkan kueri yang paling lambat dari host1 secara real time (sangat berguna!):

1
1
26

Gunakan tcpdump untuk melaporkan kueri yang paling lambat dari data protokol MySQL:

1
1
28
2
3
1
31

Akhirnya kita dapat menyimpan data kueri yang lambat dari satu host ke yang lain untuk ditinjau nantinya. Di sini kita menyimpan intisari kueri untuk slow.log ke host2:

1
1
33

Untuk mempelajari cara menggunakan tool

<?php
86 dari Percona, baca halaman manual.

Penggrafikan Kinerja MySQL dan Server

Cara menggunakan mysql query result

Grafik InnoDB Row Operations ini menunjukkan operasi baris InnoDB yang telah dilakukan: pembaruan, membaca, menghapus dan menyisipkan.

Ini adalah topik yang besar dan saya akan cukup menyentuhnya di panduan ini untuk memulai dengan pemantauan MySQL. Penting untuk dicatat secara umum, bagaimanapun, bahwa pemantauan semua layanan situs web-mu sangat ideal untuk benar-benar mengetahui apa kinerja dan penggunaanmu.

Untuk mencapai ini, saya sarankan menyiapkan solusi berbasis

<?php
89 seperti
<?php
90 dengan konfigurasi MySQL. Dapatkan template untuk Cacti dari orang-orang di Percona.

Setelah kamu menyiapkan Cacti dan dapat mulai menganalisis aplikasimu, biarkan beberapa waktu berlalu sehingga grafik dapat meningkat. Setelah beberapa hari kamu akan mulai melihat irama siang dan malam lalu lintasmu dan melihat seberapa server benar-benar sibuk.

Jika kamu mencari peringatan dan pemicu otomatis, lihat untuk mengonfigurasi monit, monitor proaktif open-source untuk sistem Unix. Dengan monit kamu dapat membuat aturan untuk servermu dan memastikanmu diberitahu ketika beban naik sehingga kamu dapat menangkapnya ketika itu terjadi.

Log Kueri Yang Lambat

Mencatat semua kueri yang lambat membutuhkan waktu lebih dari satu detik untuk menyelesaikan dapat memberi tahu kita sesuatu, tetapi juga mengetahui pertanyaan mana yang mengeksekusi ratusan kali sama pentingnya. Bahkan jika permintaan tersebut singkat untuk dieksekusi, biaya overhead permintaan tinggi masih mengambil korban di server.

Itulah mengapa tetap di sekitar ketika kamu memperbarui sesuatu dan menayangkannya secara langsung adalah waktu yang paling penting untuk setiap pekerjaan dan perubahan basis data baru. Kita selalu memiliki kebijakan di tim saya untuk tidak pernah menyinkronkan perubahan basis data fitur baru setelah hari Rabu pada proyek langsung. Itu harus dilakukan pada awal minggu, selambat-lambatnya Selasa, sehingga semua tim dapat memantau dan memberikan dukungan yang sesuai.

Sebelum menayangkan dengan kueri baru, kamu harus membuat tolok ukur dengan tool pengujian beban seperti

<?php
91. Ketika kamu menjalankan benchmark-mu, kamu harusnya melihat
<?php
83, dan juga memungkinkan logging dan memantau dengan tool-tool sistem seperti
<?php
93,
<?php
94 dan
<?php
95. Ini adalah langkah penting sebelum memasukkan kueri baru apapun ke dalam produksi langsung. Namun ini bukan tes asam 100% karena traffic langsung dapat berperilaku jauh berbeda dengan tolok ukur yang dihitung.

Untuk mengukur dengan

<?php
91, pastikan kamu memiliki paket yang diinstal, misalnya:

1
1
35
2
1
37
3
1
39
4
1
41

Sekarang kamu dapat memulai dengan menguji aplikasimu, misalnya:

1
1
43

<?php
97 berarti untuk
<?php
98 koneksi, dan
<?php
99 adalah jumlah koneksi bersamaan, yaitu jumlah orang/klien yang akan mengunjungi situs sekaligus. Akhirnya
2
00 adalah jumlah permintaan yang akan dilakukan
2
01.

Jadi dengan menjalankan perintah di atas, kamu akan menekan http://my-domain.com/ dengan 350 koneksi simultan hingga 20.000 permintaan terpenuhi, dan ini akan dilakukan menggunakan header keep-alive.

Setelah proses menyelesaikan 20.000 permintaan, kamu akan menerima umpan balik tentang statistik. Ini akan memberi tahumu seberapa baik situs dilakukan di bawah tekanan yang kamu masukkan saat menggunakan parameter di atas. Ini adalah cara yang baik untuk mengetahui dalam arti otomatis jika kuerimu telah mengubah apa pun.

Benchmarking Hot vs. Cold

Jumlah permintaan dan beban server memiliki dampak besar pada kinerja, dan waktu kueri dapat terpengaruh karena hal ini. Dalam semua kamu harus mengaktifkan log kueri yang lambat untuk menangkap ini dalam produksi, dan sebagai aturan untuk pengembanganmu harus memastikan semua pertanyaan mengeksekusi dalam pecahan milidetik (0.0xx atau lebih cepat) pada server yang menganggur.

Menerapkan

<?php
15 akan memiliki dampak yang dramatis pada persyaratan pemuatanmu dan akan digunakan untuk secara serius mengurangi sumber daya yang sedang digunakan memproses kueri. Pastikan kamu menggunakan
<?php
13 secara efektif dan memberi tolok ukur aplikasimu dengan cache hot (dimuat dengan nilai) vs. yang cold.

Untuk menghindari keluar ke produksi dengan cache kosong, skrip pre-loader adalah cara yang baik untuk memastikan cache akan dibaca dan kamu tidak akan mendapatkan banyak sekali permintaan semua datang sekaligus ketika kembali dari downtime karena kegagalan kapasitas berlebih.

Memperbaiki Query Yang Lambat

Jadi setelah mengaktifkan pencatatan, kamu sekarang menemukan beberapa kueri yang lambat di aplikasimu. Mari memperbaikinya! Sebagai contoh, saya akan menunjukkan berbagai masalah umum yang akan kamu hadapi dan logika untuk memperbaikinya.

Jika kamu belum menemukan kueri yang lambat, mungkin periksa apa setelanmu di mana untuk

<?php
75 jika kamu menggunakan metode kueri log. Jika tidak, setelah memeriksa semua kuerimu dengan pembuatan profil (se
2
05), buat daftar kueri yang memakan waktu lebih lama daripada pecahan milidetik untuk diselesaikan (0.000x detik) dan mari mulai pada semua itu.

Masalah Umum

Berikut ini enam masalah umum yang saya hadapi ketika mengoptimalkan query MySQL:

1.
<?php
21 menggunakan fileort.

1
1
45
2
1
47
3
1
49
4
1
47
$ mysqldump myTable > myTable-backup.sql
0
1
53
$ mysqldump myTable > myTable-backup.sql
2
1
47

Menghindari file pada ini tidak mungkin karena 

2
07. Tidak peduli apa permutasi indeks yang kamu gunakan, yang terbaik yang akan kamu dapatkan adalah
2
08 di kolom
<?php
28 mu Untuk mengoptimalkan ini, simpan hasilnya di Memcache, atau lakukan pemesanan di lapisan logika aplikasimu.

2. Menggunakan
<?php
21 di
<?php
12 dan
<?php
16

<?php
21 memiliki jumlah kueri signifikan pada kueri. Misalnya, berikut ini adalah gabungan
<?php
16 dari tabel
2
15 dan tabel
2
16 dengan menggunakan ID integer. Ketika memesan dihapus, begitu juga filesorting.

1
1
57
2
1
59
3
1
61
4
1
59
$ mysqldump myTable > myTable-backup.sql
0
1
65
$ mysqldump myTable > myTable-backup.sql
2
1
67
$ mysqldump myTable > myTable-backup.sql
4
1
59
$ mysqldump myTable > myTable-backup.sql
6
1
71
$ mysqldump myTable > myTable-backup.sql
8
1
0
1
74
1
2
1
76
1
4
1
78
1
6
1
76
1
8
1
82
<?php
0
1
84
<?php
2
1
76
<?php
4
1
71

Ketika itu bisa dihindari, cobalah untuk tidak menggunakan

<?php
21. Jika benar-benar harus digunakan, pesan pada kunci indeks saja.

3.
<?php
11 pada kolom sementara

Jangan lakukan itu. Jika kamu perlu mengumpulkan hasilmu, lakukan itu dalam logika aplikasimu; jangan melakukan penyaringan atau memesan pada tabel sementara di dalam MySQL. Ini akan sangat membutuhkan banyak sumber daya.

4. Tidak menggunakan indeks
<?php
50

Menggunakan kueri

2
20 adalah cara paling lambat untuk melakukan pencocokan teks lengkap pada datamu. Menerapkan pencarian teks lengkap dan menuai manfaat fitur cemerlang MySQL ini seperti:

1
1
90
2
1
92
3
1
94
4
1
96
$ mysqldump myTable > myTable-backup.sql
0
1
94
$ mysqldump myTable > myTable-backup.sql
2
<?php
00
$ mysqldump myTable > myTable-backup.sql
4
<?php
02
$ mysqldump myTable > myTable-backup.sql
6
1
94
$ mysqldump myTable > myTable-backup.sql
8
1
71

5. Memilih sejumlah besar baris yang tidak perlu

Melupakan

2
21 pada permintaan dapat secara signifikan mengubah waktu pencarian atas dataset yang besar (lebih dari satu juta baris).

6. Join yang berlebih daripada hanya membuat tabel atau view gabungan

Ketika sampai tiga atau empat tingkat

<?php
16, kamu harus bertanya pada diri sendiri: "Apakah saya melakukan ini dengan benar?" Jika kamu memiliki argumen yang masuk akal mengapa permintaan ini harus demikian, misalnya itu hanya muncul di layar admin dalam permintaan yang rendah atau dalam penggunaan tampilan statistik yang lebih besar yang dapat di-cache, kemudian diproses. Tetapi jika kamu perlu mengakses datamu secara sering dengan jumlah gabungan yang besar, kamu harus melihat bagaimana menggabungkan kolom ke dalam tabel baru mungkin lebih bermanfaat, atau membuat suatu view.

Kesimpulan

Kita telah membahas dasar-dasar optimalisasi dan tool yang kita miliki untuk melakukan pekerjaan. Kita harus mengaudit dengan membuat profil, dan menggunakan tool

<?php
86 dan
<?php
25 terlebih dahulu untuk melihat apa yang sebenarnya terjadi, dan kemudian dari sana kita dapat mendesain yang lebih baik.

Kita juga melihat beberapa contoh kasus dan perangkap umum yang dapat kamu hadapi ketika menggunakan MySQL. Menggunakan indeks mengisyaratkan kita dapat memastikan MySQL memilih indeks yang tepat untuk pekerjaan itu dan tidak bingung, terutama jika ada beberapa kueri di atas pada tabel yang sama. Untuk melanjutkan membaca tentang topik ini, periksa proyek Percona dan blog Kinerja MySQL untuk informasi lebih lanjut.

Bagaimana cara kerja query?

Cara kerja query adalah dengan memasukkan arti ke dalam kode yang memakai SQL atau software lain. Selama menggunakan bahasa yang sama, baik user atau database keduanya bisa saling bertukar informasi.

Bagaimana cara melakukan optimasi query pada MySQL?

Cara optimalisasi database mysql.
Menggunakan SELECT nama_kolom sebagai ganti SELECT * ... .
Buatlah kolom yang penting saja dan minimalisir membuat banyak kolom. ... .
Hindari penggunaan DISTINCT pada syntax SQL. ... .
Hindari mencari data menggunakan Cartesian atau CROSS JOIN. ... .
Gunakan wildcard atau % pada akhiran kata saja..

Bagaimana membuat query SQL?

Untuk melakukan query menggunakan SQL jalankan langkah berikut:.
Pada bagian Ribbon klik Tab Create..
Klik Query Design..
Tutup jendela Show Table yang muncul setelahnya..
Pada Ribbon Design klik SQL View..
Pada jendela query yang muncul, pembaca dapat mengetikkan query yang diinginkan..
Setelah query diinputkan, klik Run..

MySQL query untuk apa?

MySQL Query adalah perintah atau instruksi yang dapat digunakan untuk mengelola database atau tabel dalam database MySQL. Query lebih dikenal dengan sebutan SQL (Structured Query Language) yang artinya adalah sebuah bahasa yang digunakan untuk mengakses data dalam basis data relasional.