Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Permintaan lambat Mysql:GABUNG + beberapa WHERES + ORDER BY

Indeks membuat perbedaan besar di mysql, satu kueri yang membutuhkan waktu 15 menit dengan kumpulan indeks yang salah membutuhkan waktu 0,2 detik dengan yang benar, tetapi menemukan keseimbangan yang tepat itulah yang umumnya menjadi masalah. Tentu saja tanpa beberapa data sampel, sangat sulit untuk mengatakan apakah solusi di bawah ini akan menghemat waktu Anda, tetapi secara teori seharusnya demikian.

Untuk menjawab pertanyaan Anda, saya akan mendesain ulang tabel seperti ini:

CREATE TABLE `product_all` ( 
`prod_id` INT( 10 ) NOT NULL, 
`ref_id` INT( 10) NOT NULL, 
`date` DATE NOT NULL , 
`buy_link` BLOB NOT NULL , 
`sale_price` FLOAT NOT NULL,
PRIMARY KEY (prod_id, ref_id) ,
INDEX date_Index (`date` ASC),
UNIQUE INDEX prod_price_Index (prod_id ASC, sale_price ASC)
) ENGINE = MYISAM ; 


CREATE TABLE `product_info` ( 
`prod_id` INT( 10 ) NOT NULL AUTO_INCREMENT, 
`prod_name` VARCHAR( 200 ) NOT NULL, 
`brand` VARCHAR( 50 ) NOT NULL, 
`retail_price` FLOAT NOT NULL, 
`category` INT( 3 ) NOT NULL, 
`gender` VARCHAR( 1 ) NOT NULL, 
`type` VARCHAR( 10 ) NOT NULL,
PRIMARY KEY (prod_id) ,
UNIQUE INDEX prod_id_name_Index (prod_id ASC, prod_name ASC),
INDEX category_Index (category ASC),
INDEX gender_Index (gender ASC)
) ENGINE = MYISAM ;

SELECT product_info.*, MIN(product_all.sale_price) as sale_price, product_all.buy_link         
FROM product_info         
NATURAL JOIN (SELECT * FROM product_all WHERE product_all.date = '2010-09-30') as product_all         
WHERE (product_info.category = 2           
AND product_info.gender = 'W' )         
GROUP BY product_all.prod_id         
ORDER BY MIN(product_all.sale_price) ASC LIMIT 13        

Keuntungan kinerja di sini diperoleh dengan mengindeks bidang utama yang digabungkan dan ditampilkan dalam klausa where. Secara pribadi saya akan pergi dengan permintaan pertama Anda seperti ketika Anda memikirkannya yang seharusnya berkinerja lebih baik.

Sejauh yang saya mengerti apa yang terjadi di kueri pertama dan kedua:

  • Kueri pertama difilter oleh subkueri sebelum melakukan natural join, artinya hanya bergabung dalam data yang dihasilkan dan bukan seluruh tabel.
  • Kueri kedua adalah menggabungkan seluruh tabel kedua dan kemudian memfilter baris yang dihasilkan dari keseluruhan lot kembali ke apa yang Anda inginkan.

Sebagai aturan praktis biasanya Anda ingin menambahkan indeks pada bidang gabungan utama Anda dan juga bidang yang paling sering Anda gunakan di klausa where. Saya juga telah menempatkan beberapa indeks unik pada beberapa bidang yang ingin Anda kueri secara teratur, seperti prod_id_name_Index.

Jika ini tidak meningkatkan kinerja Anda, jika Anda mungkin dapat memposting beberapa data palsu untuk dimainkan, saya mungkin bisa mendapatkan solusi yang lebih cepat yang dapat saya tolok ukur.

Di sini adalah artikel yang melewati pengindeksan untuk kinerja di mysql, layak dibaca jika Anda ingin tahu lebih banyak.

Semoga berhasil!

EDIT:Pertanyaan terakhir Anda yang saya lewatkan pertama kali, jawabannya adalah jika Anda mengindeks bidang gabungan utama kemudian berubah ke mana hanya akan sedikit memengaruhi kinerja keseluruhan, tetapi indeks unik yang saya letakkan di tabel harus memperhitungkan sebagian besar hal yang ingin Anda jadikan dasar kueri. Hal utama yang perlu diingat adalah jika Anda sering melakukan kueri atau bergabung pada suatu bidang, maka bidang itu harus benar-benar diindeks, tetapi kueri kecil dan perubahan urutan oleh Anda tidak perlu khawatir tentang penyelarasan kembali strategi pengindeksan Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menampilkan � bukannya £

  2. bungkus kata tidak membiarkan angka membungkus juga

  3. Permintaan SPARQL untuk mendapatkan semua induk dari sebuah simpul

  4. Cara Mengakses PhpMyAdmin tanpa login cPanel

  5. Bagaimana cara mengurutkan berdasarkan tanggal sebelumnya dalam database?