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

Pengoptimalan Kueri MySQL - kueri dalam

Anda selalu dapat menggunakan MENJELASKAN atau MENJELASKAN DIPERPANJANG untuk melihat apa yang dilakukan MySql dengan kueri

Anda juga dapat menulis kueri dengan cara yang sedikit berbeda, sudahkah Anda mencoba yang berikut ini?

SELECT        s.*, 
              sm.url AS media_url 
FROM          shows AS s
INNER JOIN    show_medias AS sm ON s.id = SM.show_id
WHERE `s`.`id` IN ( 
                        SELECT DISTINCT st.show_id 
                        FROM show_time_schedules AS sts 
                        LEFT JOIN show_times AS st ON st.id = sts.show_time_id 
                        WHERE sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date) 
                        ) 
AND            `s`.`is_active` = 1 
AND            sm.is_primary = 1
ORDER BY       s.name asc 

Akan menarik untuk melihat apa efeknya. Saya berharap ini lebih cepat karena, saat ini, saya pikir MySql akan menjalankan kueri dalam 1 untuk setiap acara yang Anda miliki (sehingga satu kueri akan dijalankan berkali-kali. Penggabungan harus lebih efisien.)

Ganti INNER JOIN dengan LEFT JOIN jika Anda ingin semua acara yang tidak memiliki baris di show_medias.

EDIT:

Saya akan melihat EXPLAIN EXTENDED Anda segera, saya juga ingin tahu apakah Anda ingin mencoba yang berikut ini; itu menghapus semua subkueri:

SELECT        DISTINCT s.*,  
                       sm.url AS media_url  
FROM                   shows AS s 
INNER JOIN             show_medias AS sm ON s.id = SM.show_id
INNER JOIN             show_times AS st ON (s.id = st.show_id)
RIGHT JOIN             show_time_schedules AS sts ON (st.id = sts.show_time_id)

WHERE                  `s`.`is_active` = 1  
AND                    sm.is_primary = 1 
AND                    sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date)  
ORDER BY               s.name asc 

(Akan bagus juga untuk melihat JELASKAN DIPERPANJANG tentang ini - Anda dapat menambahkannya ke komentar untuk yang ini).

EDIT lebih lanjut:

Pada EXPLAIN EXTENDED Anda (awal yang baik tentang cara membaca ini ada di sini )

MENGGUNAKAN FILESORT dan MENGGUNAKAN SEMENTARA keduanya merupakan indikator utama. Mudah-mudahan, kueri kedua yang saya rekomendasikan harus menghapus tabel SEMENTARA (di subkueri). Coba tinggalkan ORDER BY untuk melihat apakah itu membuat perbedaan (dan sejauh ini kami dapat menambahkannya ke temuan :-)

Saya juga dapat melihat bahwa kueri berpotensi kehilangan banyak pencarian indeks; semua kolom id Anda adalah kandidat utama untuk pencocokan indeks (dengan peringatan indeks ). Saya juga mencoba menambahkan indeks tersebut dan kemudian menjalankan EXPLAIN EXTENDED lagi untuk melihat apa perbedaannya sekarang (EDIT seperti yang sudah kami ketahui dari komentar Anda di atas!)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Apa yang setara dengan sqlite dari MySQL's INTERVAL dan UTC_TIMESTAMP?

  2. Tanggal saat ini dalam klausa MySQL WHERE

  3. Doctrine 2 SUM() pembantu yang setara?

  4. Beberapa Output kueri ke dalam Tabel tunggal

  5. Output perintah MySQL terlalu lebar di klien baris perintah