Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan MySQL Perlahan untuk Meningkatkan Prestasi dan Mengurangkan I/O Cakera?

Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan MySQL Perlahan untuk Meningkatkan Prestasi dan Mengurangkan I/O Cakera?

Linda Hamilton
Linda Hamiltonasal
2024-12-30 20:24:11950semak imbas

How Can I Optimize a Slow MySQL Query to Improve Performance and Reduce Disk I/O?

Mengoptimumkan Pertanyaan MySQL untuk Mengurangkan Masa Pelaksanaan dan Tulisan Cakera

Pertanyaan MySQL anda menghadapi masalah prestasi, mengambil masa beberapa minit untuk disiapkan dan menulis ke cakera semasa pelaksanaan. Ini boleh memberi kesan ketara kepada responsif halaman web anda. Untuk menangani perkara ini, kami akan meneroka penyelesaian yang melibatkan pemodelan data dan pengoptimuman indeks.

Pertanyaan perlahan yang anda nyatakan ialah:

SELECT * 
FROM poster_prodcat, 
     poster_data, 
     poster_categories 
WHERE poster_data.apnumber = poster_prodcat.apnumber 
  AND poster_categories.apcatnum = poster_prodcat.apcatnum 
  AND poster_prodcat.apcatnum='623'  
ORDER BY aptitle ASC 
LIMIT 0, 32

Menurut keluaran EXPLAIN, pertanyaan itu melaksanakan penuh imbasan jadual pada jadual poster_prodcat, yang mengandungi lebih 17 juta baris. Ini menyumbang kepada masa pelaksanaan yang berlebihan.

Untuk mengoptimumkan prestasi pertanyaan, kami boleh melaksanakan perubahan berikut:

Normalisasi dan Pengindeksan:

  1. Normalkan Data: Tukar jadual poster_prodcat menjadi normal struktur dengan dua jadual: poster dan kategori. Buat jadual ketiga, poster_category, untuk mewujudkan hubungan antara poster dan kategori.
  2. Buat Indeks: Buat indeks pada lajur yang sesuai dalam jadual poster, kategori dan poster_category. Ini akan membolehkan pangkalan data mencari data dengan cepat tanpa perlu melakukan imbasan jadual penuh.

Berikut ialah contoh skema yang dikemas kini:

CREATE TABLE poster (
  poster_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (poster_id)
) ENGINE=InnoDB;

CREATE TABLE category (
  cat_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (cat_id)
) ENGINE=InnoDB;

CREATE TABLE poster_category (
  cat_id MEDIUMINT UNSIGNED NOT NULL,
  poster_id INT UNSIGNED NOT NULL,
  PRIMARY KEY (cat_id, poster_id),
  INDEX (poster_id) -- Clustered composite index
) ENGINE=InnoDB;

Setelah data dinormalisasi dan diindeks , pertanyaan harus berprestasi lebih pantas, mengurangkan masa pelaksanaan dengan ketara.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengoptimumkan Pertanyaan MySQL Perlahan untuk Meningkatkan Prestasi dan Mengurangkan I/O Cakera?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn