Kami memiliki aplikasi web sederhana yang berjalan pada mesin virtual yang menyimpan datanya dalam database MySQL 5.5 dengan mesin InnoDB. Semuanya bekerja dengan baik selama sekitar tiga tahun, tetapi tiba-tiba menjadi sangat lambat.
Sebagai contoh, saya memiliki alamat memegang tabel yang sangat sederhana:
CREATE TABLE `addresses` (
`address_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET latin1 NOT NULL,
`firstname` varchar(64) CHARACTER SET latin1 NOT NULL,
`street` varchar(64) CHARACTER SET latin1 NOT NULL,
`housenumber` varchar(16) CHARACTER SET latin1 NOT NULL,
`zip` varchar(5) CHARACTER SET latin1 NOT NULL,
`city` varchar(64) CHARACTER SET latin1 NOT NULL,
`email` varchar(64) CHARACTER SET latin1 NOT NULL,
`phone` varchar(16) CHARACTER SET latin1 NOT NULL,
`birthdate` date NOT NULL,
PRIMARY KEY (`address_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Tabel ini menampung sekitar 800 entri yang sebenarnya tidak banyak. Tetapi menjalankan kueri
SELECT * FROM addresses
untuk tujuan pengujian, sepertinya tidak pernah selesai. Saya memeriksa ini dengan CLI mysql di server itu sendiri: Ini output beberapa baris tabel dan kemudian menunggu sangat lama sampai output baris berikutnya.
Jadi mungkin itu adalah masalah dalam fase pengiriman data, tapi saya tidak yakin.
VM memiliki 2GB RAM dan hanya 320MB yang digunakan. CPU juga beroperasi pada sangat rendah 1 hingga 2%. mytop tidak menampilkan kueri lain yang memblokir server. Admin TI mengatakan bahwa mereka tidak mengubah apa pun di sisi perangkat keras.
Saya sudah mencoba beberapa hal seperti me-restart server database, me-restart mesin virtual. Tidak ada yang membantu.
edit:
EXPLAIN SELECT * FROM addresses
memberi saya hasil ini:
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | addresses | ALL | NULL | NULL | NULL | NULL | 793 | |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
sumber
mysql -u username -ppassword mydb -e 'SELECT * FROM addresses
menghasilkan lambat, tetapi menambahkan `> test.txt`, itu berjalan sangat cepat. Sekarang ini mungkin pertanyaan yang berbeda !? Bagaimana saya bisa menyelidiki ini?Jawaban:
Jika beban cpu rendah maka ini menunjukkan bahwa tidak ada masalah dengan indeks yang hilang, jika itu masalahnya, permintaan hanya perlu mengambil lebih banyak cpu dan akses disk. Anda juga mengatakan itu bekerja dengan baik selama 3 tahun.
Apakah Anda memeriksa kecepatan akses disk umum (khususnya pada partisi tempat database berada)? Misalnya menggunakan
dd
seperti di sini . Apa yang Anda gambarkan terdengar seperti disk mati atau serangan setengah mati. Punya cadangan saya harap?sumber
Anda dapat mencoba beberapa hal,
Pengindeksan memungkinkan untuk menemukan catatan dengan cepat tanpa melakukan pemindaian tabel penuh terlebih dahulu, memotong waktu eksekusi secara dramatis.
Ketika digunakan di depan kueri SELECT, itu akan menjelaskan bagaimana MySQL bermaksud untuk mengeksekusi kueri dan jumlah baris yang akan perlu diproses sebelum selesai.
Ada banyak pengoptimal MySQL di luar sana yang dapat memandu Anda.
Bantu ini membantu
sumber
htop
menunjukkan bahwa hanya 307MB dari 2050MB RAM yang digunakan.name
dan 'nama depan'. Kedua, Anda yakin melakukan pengindeksan dengan benar? possible_keys: NULL jika kolom NULL, ini menunjukkan tidak ada indeks yang relevan yang dapat ditemukan.