Pesanan menurut kolom harus ada indeks atau tidak?

35

Saya telah menambahkan indeks ke tabel yang digunakan untuk hasil pencarian. Saya menunjukkan hasil dengan urutan ASC atau DESC. Jadi kolom itu harus punya indeks atau tidak? Saya memiliki 2 indeks lagi di tabel itu. Bagaimana kinerja akan memengaruhi dengan membuat atau tidak membuat indeks ke kolom itu?

Somnath Muluk
sumber
2
Silakan kirim kueri
RolandoMySQLDBA

Jawaban:

26

Ya, MySQL dapat menggunakan indeks pada kolom di ORDER BY (dalam kondisi tertentu). Namun, MySQL tidak dapat menggunakan indeks untuk ASC campuran , pesanan DESC oleh ( SELECT * FROM foo ORDER BY bar ASC, pants DESC). Membagikan pertanyaan Anda dan pernyataan CREATE TABLE akan membantu kami menjawab pertanyaan Anda secara lebih spesifik.

Untuk petunjuk tentang cara mengoptimalkan ORDER BY klausa: http://dev.mysql.com/doc/refman/5.1/en/order-by-optimization.html

Edit 2012-01-21 8:53 AM

Ada pertanyaan tentang sumber pernyataan saya tentang penggunaan indeks dengan campuran ASC / DESC di ORDER BY. Dari dokumentasi ORDER BY Optimization :

Dalam beberapa kasus, MySQL tidak dapat menggunakan indeks untuk menyelesaikan ORDER BY, meskipun masih menggunakan indeks untuk menemukan baris yang cocok dengan klausa WHERE. Kasus-kasus ini meliputi:

...

Anda mencampur ASC dan DESC:

SELECT * DARI t1 ORDER OLEH key_part1 DESC, key_part2 ASC;

...

Selain itu, kata kunci DESC tidak ada artinya dalam CREATE INDEX

Spesifikasi index_col_name dapat diakhiri dengan ASC atau DESC. Kata kunci ini diizinkan untuk ekstensi di masa mendatang untuk menentukan penyimpanan nilai indeks naik atau turun. Saat ini, mereka diurai tetapi diabaikan; nilai indeks selalu disimpan dalam urutan menaik.

Aaron Brown
sumber
3
"MySQL tidak dapat menggunakan indeks untuk campuran ASC, DESC" . Referensi untuk ini?
ypercubeᵀᴹ
CREATE INDEX idx_foo ON foo(bar ASC, pants DESC);harus bekerja.
Frank Heikens
Sumber saya adalah dokumentasi mysql yang ditautkan dalam jawaban saya. Cari "mix."
Aaron Brown
3
MySQL mem-parsing & Desc dalam CREATE INDEX, tetapi abaikan saja. Indeks selalu disimpan dalam urutan menaik. dev.mysql.com/doc/refman/5.5/en/create-index.html
Aaron Brown
1
Baru dengan MySQL 8.0 : Sekarang bisa menggunakan campuran ASCdan DESC jika yang INDEXmemiliki campuran yang sama.
Rick James
4

Bagi siapa pun yang bertanya tentang jawaban yang terkait dengan PostgreSQL, jawabannya adalah ya, indeks akan digunakan. Sesuai dengan dokumentasi PostgreSQL , perencana kueri "akan mempertimbangkan memenuhi spesifikasi ORDER BY baik dengan memindai indeks yang tersedia yang sesuai dengan spesifikasi, atau dengan memindai tabel dalam urutan fisik dan melakukan pengurutan eksplisit." Ini berarti bahwa jika ada indeks yang dapat digunakan perencana itu akan melakukannya, kembali melakukan pengurutan setelah mengambil baris yang cocok.

douglasr
sumber