Dalam kasus terburuk, saat Anda melihat bidang yang tidak terindeks, penggunaan MIN()
memerlukan satu jalur penuh tabel. Menggunakan SORT
dan LIMIT
membutuhkan fileort. Jika dijalankan dengan tabel besar, kemungkinan akan ada perbedaan signifikan dalam kinerja yang dipersepsi. Sebagai titik data yang tidak berarti, MIN()
mengambil .36s sementara SORT
dan LIMIT
mengambil .84s melawan tabel baris 106.000 di server dev saya.
Namun, jika Anda melihat kolom yang diindeks, perbedaannya lebih sulit untuk diperhatikan (poin data yang tidak berarti adalah 0,00 dalam kedua kasus). Melihat output dari menjelaskan, bagaimanapun, sepertinya MIN()
dapat dengan mudah memetik nilai terkecil dari indeks (baris 'Pilih tabel yang dioptimalkan' dan 'NULL') sedangkan SORT
dan LIMIT
masih perlu melakukan traversal indeks (106.000 baris). Dampak kinerja sebenarnya mungkin dapat diabaikan.
Sepertinya MIN()
begitulah cara untuk pergi - lebih cepat dalam kasus terburuk, tidak dapat dibedakan dalam kasus terbaik, adalah SQL standar dan paling jelas mengekspresikan nilai yang Anda coba dapatkan. Satu-satunya kasus di mana tampaknya menggunakan SORT
dan LIMIT
akan diinginkan adalah, seperti yang disebutkan mson , di mana Anda menulis operasi umum yang menemukan nilai N atas atau bawah dari kolom arbitrer dan tidak ada gunanya menulis operasi kasus khusus.
Hanya karena itu kompatibel dengan ANSI. Batas 1 khusus untuk MySql karena TOP untuk SQL Server.
sumber
Seperti yang ditunjukkan oleh mson dan Sean McSomething , MIN lebih disukai.
Satu alasan lain di mana ORDER BY + LIMIT berguna adalah jika Anda ingin mendapatkan nilai kolom yang berbeda dari kolom MIN.
Contoh:
sumber
Saya pikir jawabannya tergantung pada apa yang Anda lakukan.
Jika Anda memiliki kueri 1 kali dan maksudnya sesederhana yang Anda tentukan, pilih min (bidang) lebih disukai.
Namun, biasanya jenis persyaratan ini berubah menjadi - ambil n hasil teratas, ambil hasil nth - bln, dll.
Saya tidak berpikir itu ide yang terlalu buruk untuk berkomitmen pada database pilihan Anda. Mengubah dbs tidak boleh dilakukan dengan mudah dan harus merevisi harga yang Anda bayarkan saat Anda melakukan langkah ini.
Mengapa membatasi diri Anda sekarang, untuk rasa sakit yang mungkin Anda rasakan atau tidak rasakan di kemudian hari?
Saya pikir itu baik untuk tetap ANSI sebanyak mungkin, tapi itu hanya pedoman ...
sumber
Dengan kinerja yang dapat diterima, saya akan menggunakan yang pertama karena secara semantik mendekati maksudnya.
Jika kinerja menjadi masalah, (Sebagian besar pengoptimal modern mungkin akan mengoptimalkan keduanya ke rencana kueri yang sama, meskipun Anda harus menguji untuk memverifikasi itu) maka tentu saja saya akan menggunakan yang lebih cepat.
sumber