MySQL sangat lambat pada permintaan SELECT yang sangat sederhana


10

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)

Kotak Virtual, Xen atau yang lainnya? Bagaimana disk host diatur? apakah ada VM lain di kotak yang sama berjalan lambat juga? Menjawab pertanyaan-pertanyaan itu mungkin mengungkapkan jawabannya
Matt

Saya bukan pemilik hypervisor, jadi saya tidak bisa menjawabnya. Saya sudah bertanya kepada admin hypervisor apakah mereka tahu ada perubahan baru-baru ini, tapi dia bilang tidak.
tabb

Jika Anda bisa, matikan mysql dan jalankan beberapa benchmark disk dan memori Tidak harus rumit. Idenya adalah untuk hanya mengisolasi jika itu masalah dengan mysql, mungkin masalah indeks seperti yang ditunjukkan dalam jawaban di bawah ini, atau lebih luas.
Matt

Poin bagus, saya mengalaminya mungkin bukan masalah mysql. Menjalankan mysql -u username -ppassword mydb -e 'SELECT * FROM addressesmenghasilkan lambat, tetapi menambahkan `> test.txt`, itu berjalan sangat cepat. Sekarang ini mungkin pertanyaan yang berbeda !? Bagaimana saya bisa menyelidiki ini?
tabb

Hubungi pemilik hypervisor dan minta mereka untuk memeriksa log jika ada kesalahan. Khususnya kesalahan disk. Katakan padanya gejalanya. Cadangkan sekarang.
Matt

Jawaban:


13

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?


Itu poin yang bagus. Bisa jadi sesuatu yang sederhana seperti kesalahan disk di host.
Matt

9

Anda dapat mencoba beberapa hal,

  1. Apakah Anda memiliki pengaturan indeks?

Pengindeksan memungkinkan untuk menemukan catatan dengan cepat tanpa melakukan pemindaian tabel penuh terlebih dahulu, memotong waktu eksekusi secara dramatis.

CREATE INDEX idx_name ON addresses(name);
  1. Sebelum menjalankan kueri, gunakan kata kunci EXPLAIN terlebih dahulu,

Ketika digunakan di depan kueri SELECT, itu akan menjelaskan bagaimana MySQL bermaksud untuk mengeksekusi kueri dan jumlah baris yang akan perlu diproses sebelum selesai.

  1. Buat beberapa perubahan pada mysql.ini Anda, jika VMnya meningkatkan RAM dan konfigurasikan mysql.ini Anda untuk melihat apakah kinerjanya meningkat.

Ada banyak pengoptimal MySQL di luar sana yang dapat memandu Anda.

Bantu ini membantu


Oke, tetapi membuat indeks pada tabel yang cukup kecil (<800 baris) tampaknya tidak membantu seperti yang saya perlukan. Dibutuhkan lebih dari satu menit untuk menyelesaikan kueri yang dikutip di atas. Pemindaian tabel penuh pada meja sekecil itu seharusnya tidak memakan waktu lama.
tabb

Jadi ... apakah Anda menambahkan indeks? Jika Anda tidak yakin apa masalahnya, saya akan mulai dasar dan bekerja dengan cara saya. Menambahkan indeks hanya akan meningkatkan kinerja jika dilakukan dengan benar.
Anthony Fornito

Ya, saya menambahkan indeks pada kolom nama. Tetapi permintaan saya di atas bahkan tidak memiliki klausa WHERE yang dibatasi, jadi harus membaca seluruh tabel dan mencetaknya. Menambahkan indeks tidak membantu.
tabb

Saya menambahkan hasil dari kueri EXPLAIN di atas. Ini terlihat baik bagi saya, tetapi kinerjanya masih sangat rendah. Saya tidak dapat menambah RAM karena saya bukan admin manajer virtualisasi. Tetapi htopmenunjukkan bahwa hanya 307MB dari 2050MB RAM yang digunakan.
tabb

Tentang indeks Anda benar-benar perlu berpikir tentang kolom mana yang akan diindeks, Anda tidak ingin hanya mengindeks semuanya, indeks yang memiliki jumlah terbesar, saya membuat beberapa asumsi liar tentang ini tetapi saya akan mulai dengan namedan '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.
Anthony Fornito
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.