Jika saya punya meja
CREATE TABLE users (
id int(10) unsigned NOT NULL auto_increment,
name varchar(255) NOT NULL,
profession varchar(255) NOT NULL,
employer varchar(255) NOT NULL,
PRIMARY KEY (id)
)
dan saya ingin mendapatkan semua nilai unik profession
bidang, apa yang lebih cepat (atau disarankan):
SELECT DISTINCT u.profession FROM users u
atau
SELECT u.profession FROM users u GROUP BY u.profession
?
Jawaban:
Mereka pada dasarnya setara satu sama lain (sebenarnya ini adalah bagaimana beberapa database mengimplementasikan di
DISTINCT
bawah tenda).Jika salah satu dari mereka lebih cepat, itu akan terjadi
DISTINCT
. Ini karena, meskipun keduanya sama, pengoptimal kueri harus mengetahui fakta bahwa AndaGROUP BY
tidak memanfaatkan anggota grup mana pun, hanya kunci mereka.DISTINCT
membuat ini eksplisit, sehingga Anda bisa lolos dengan pengoptimal yang sedikit bodoh.Jika ragu, uji!
sumber
DISTINCT
danGROUP BY
berbeda dalam halDISTINCT
itu tidak harus mengurutkan output, danGROUP BY
secara default tidak. Namun, di MySQL bahkan aDISTINCT
+ORDER BY
mungkin masih lebih cepat daripadaGROUP BY
karena petunjuk tambahan untuk pengoptimal seperti yang dijelaskan oleh SquareCog.Jika Anda memiliki indeks aktif
profession
, keduanya adalah sinonim.Jika tidak, gunakan
DISTINCT
.GROUP BY
dalamMySQL
berbagai macam hasil. Anda bahkan dapat melakukannya:dan selesaikan profesi Anda
DESC
.DISTINCT
membuat tabel sementara dan menggunakannya untuk menyimpan duplikat.GROUP BY
melakukan hal yang sama, tetapi mengurutkan hasil yang berbeda sesudahnya.Begitu
lebih cepat, jika Anda tidak memiliki indeks
profession
.sumber
ORDER BY NULL
keGROUP BY
untuk menghindari penyortiran.Semua jawaban di atas benar, untuk kasus DISTINCT pada satu kolom vs GROUP BY pada satu kolom. Setiap mesin db memiliki implementasi dan optimalisasi sendiri, dan jika Anda peduli dengan perbedaan yang sangat kecil (dalam kebanyakan kasus) maka Anda harus menguji server tertentu DAN versi spesifik! Karena implementasinya dapat berubah ...
TETAPI, jika Anda memilih lebih dari satu kolom dalam kueri, maka PERBEDAAN pada dasarnya berbeda! Karena dalam hal ini akan membandingkan SEMUA kolom dari semua baris, bukan hanya satu kolom.
Jadi, jika Anda memiliki sesuatu seperti:
Merupakan kesalahan umum untuk berpikir bahwa kata kunci DISTINCT membedakan baris dengan kolom pertama yang Anda tentukan, tetapi DISTINCT adalah kata kunci umum dengan cara ini.
Jadi, orang yang Anda harus berhati-hati untuk tidak mengambil jawaban di atas sebagai benar untuk semua kasus ... Anda mungkin bingung dan mendapatkan hasil yang salah sementara yang Anda inginkan adalah mengoptimalkan!
sumber
Pergi untuk yang paling sederhana dan terpendek jika Anda bisa - BERPIKIR tampaknya lebih apa yang Anda cari hanya karena itu akan memberi Anda PERSIS jawaban yang Anda butuhkan dan hanya itu!
sumber
Kelompokkan lebih mahal daripada Yang Berbeda karena Kelompokkan mengurutkan hasil sementara yang berbeda menghindarinya. Tetapi jika Anda ingin membuat grup dengan menghasilkan hasil yang sama seperti berbeda, beri perintah dengan nol ..
adalah sama dengan
sumber
SELECT profession FROM users GROUP BY profession
well well bisa lebih lambat daripada grup pada beberapa kesempatan di postgres (tidak tahu tentang dbs lain)
contoh yang diuji:
http://www.pgsql.cz/index.php/PostgreSQL_SQL_Tricks_I
jadi hati-hati ... :)
sumber
Tampaknya kueri tidak persis sama. Setidaknya untuk MySQL.
Membandingkan:
Permintaan kedua memberikan tambahan "Menggunakan filesort" di Extra.
sumber
ORDER BY NULL
keGROUP BY
versi dan mereka akan sama.Dalam MySQL , "
Group By
" menggunakan langkah tambahan:filesort
. Saya menyadariDISTINCT
lebih cepat daripadaGROUP BY
, dan itu mengejutkan.sumber
Setelah pengujian berat kami sampai pada kesimpulan bahwa GROUP BY lebih cepat
SELECT sql_no_cache opnamegroep_intern DARI
telwerken
MANAopnemergroep
(7,8,9,10,11,12,13) dikelompokkan oleh opnamegroep_intern635 totaal 0,0944 detik Weergave van mencatat 0 - 29 (635 totaal, kueri duurde 0,0484 dtk)
PILIH sql_no_cache berbeda (opnamegroep_intern) DARI DI
telwerken
MANAopnemergroep
(7,8,9,10,11,12,13)635 totaal 0,2117 detik (hampir 100% lebih lambat) Weergave van mencatat 0 - 29 (635 totaal, kueri duurde 0,3468 detik)
sumber
(lebih dari catatan fungsional)
Ada kasus ketika Anda harus menggunakan GROUP BY, misalnya jika Anda ingin mendapatkan jumlah karyawan per perusahaan:
Dalam skenario seperti
DISTINCT u.employer
itu tidak berhasil. Mungkin ada jalan, tapi saya tidak tahu. (Jika seseorang tahu cara membuat pertanyaan dengan DISTINCT, harap tambahkan catatan!)sumber
Berikut ini adalah pendekatan sederhana yang akan mencetak 2 waktu berlalu yang berbeda untuk setiap permintaan.
ATAU coba SET WAKTU STATISTIK (Transact-SQL)
Ini hanya menampilkan jumlah milidetik yang diperlukan untuk mem-parsing, mengkompilasi, dan mengeksekusi setiap pernyataan seperti di bawah ini:
sumber
Ini bukan aturan
Untuk setiap kueri .... coba secara terpisah yang berbeda lalu kelompokkan dengan ... bandingkan waktu untuk menyelesaikan setiap kueri dan gunakan yang lebih cepat ....
Dalam proyek saya kadang-kadang saya menggunakan grup oleh dan orang lain yang berbeda
sumber
Jika Anda tidak harus melakukan fungsi grup apa pun (jumlah, rata-rata dll jika Anda ingin menambahkan data numerik ke tabel), gunakan SELECT DISTINCT. Saya curiga ini lebih cepat, tetapi saya tidak punya apa-apa untuk ditunjukkan.
Bagaimanapun, jika Anda khawatir tentang kecepatan, buat indeks pada kolom.
sumber
SELECT DISTINCT akan selalu sama, atau lebih cepat, daripada GROUP BY. Pada beberapa sistem (yaitu Oracle), mungkin dioptimalkan untuk sama dengan berbeda untuk sebagian besar permintaan. Pada yang lain (seperti SQL Server), ini bisa menjadi jauh lebih cepat.
sumber
Jika masalah memungkinkan, coba dengan EXIS, karena ini dioptimalkan untuk mengakhiri segera setelah hasilnya ditemukan (Dan jangan buffer setiap respons), jadi, jika Anda hanya mencoba untuk menormalkan data untuk klausa WHERE seperti ini
Respons yang lebih cepat adalah:
Ini tidak selalu mungkin tetapi jika tersedia Anda akan melihat respons yang lebih cepat.
sumber