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

Indeks apa untuk meningkatkan kinerja JOIN dan GROUP BY

Kiat profesional Hindari SELECT * atau SELECT table.* dalam kueri yang sensitif terhadap kinerja. Alih-alih pilih, berdasarkan nama, kolom yang benar-benar perlu Anda gunakan

Kiat profesional MySQL memiliki ekstensi tidak standar yang terkenal untuk GROUP BY yang Anda gunakan, dan mungkin disalahgunakan. Baca ini. https://dev.mysql.com/doc /refman/8.0/en/group-by-handling.html Jika Anda mengikuti tip pro pertama, mengikuti tip kedua akan jauh lebih mudah.

Kiat profesional Hindari "melempar" banyak indeks kolom tunggal dengan harapan mempercepat kueri Anda. Sebagai gantinya, buat indeks, sering kali indeks gabungan, sesuai dengan kebutuhan kueri Anda yang sebenarnya. Baca https://use-the-index-luke.com ini .

Kiat profesional Using temporary; using filesort muncul di EXPLAIN output belum tentu buruk. Ini berarti bahwa mesin kueri harus men-cache sebagian hasil yang ditetapkan sebelum mengembalikannya. temporary hal ini bukan tabel yang sebenarnya, itu adalah struktur RAM. Jika terlalu besar sehingga membanjiri RAM, MySQL akan menumpahkannya ke disk. Tapi milikmu tidak.

Semua itu dikatakan, mari perbaiki kueri Anda. Saya kira Anda ingin mengambil baris dengan idCartDATA terbesar nilai untuk setiap CartSplitData.SUPPLIERID .

Jadi mari kita tulis itu sebagai subquery.

                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID

Permintaan ini dapat dipercepat, secara dramatis, dengan meletakkan indeks gabungan pada CartSplitData:(SUPPLIERID, IDCartDATA) .

Selanjutnya, tulis ulang kueri utama Anda untuk menemukan baris yang cocok dengan id dalam subkueri tersebut.

SELECT CartData.*             /* * hammers performance */
       CartSplitData.*        /* * hammers performance */
  FROM CartData
  JOIN CartSplitData ON CartSplitData.IDCartDATA = CartDATA.IDCartData
  JOIN (
                  SELECT max(IDCartDATA) AS IDCartDATA, SUPPLIERID
                    FROM CartSplitData
                   GROUP BY SUPPLIERID
       )x ON x.SUPPLIERID = CartSplitData.SUPPLIERID
         AND x.IDCartData = CartSplitData.IDCartData
 WHERE CartData.CartOrderref = 'XXXXXXXXX'

Indeks Anda di CartData.CartOrderref akan membantu kueri luar ini, seperti halnya indeks gabungan yang dibuat ^^^.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL:dapatkan MAX atau GREATEST dari beberapa kolom, tetapi dengan bidang NULL

  2. sambungkan ECONNREFUSED - simpul js, sql

  3. Dapatkah saya menggunakan pernyataan yang disiapkan PDO untuk mengikat pengidentifikasi (nama tabel atau bidang) atau kata kunci sintaks?

  4. Apakah ada fungsi di MySQL yang akan memampatkan hasil yang dikembalikan dari kueri?

  5. Bagaimana cara memilih jumlah baris terbatas untuk setiap kunci asing?