MySQL - mengapa tidak mengindeks setiap bidang?

107

Baru-baru ini saya mempelajari keajaiban indeks, dan kinerja telah meningkat secara dramatis. Namun, dengan semua yang telah saya pelajari, saya tidak dapat menemukan jawaban untuk pertanyaan ini.

Indeks memang bagus, tetapi mengapa seseorang tidak bisa mengindeks semua bidang untuk membuat tabel sangat cepat? Saya yakin ada alasan bagus untuk tidak melakukan ini, tapi bagaimana dengan tiga bidang dalam tabel tiga puluh bidang? 10 dalam 30 bidang? Di mana seseorang harus menarik garis, dan mengapa?

Vael Victus
sumber
7
coba masukkan nilai ke dalam tabel dengan lebih dari 10k entri yang diindeks, semua entri harus diperbarui karena penyisipan / penghapusan dan ini adalah overhead waktu yang sangat besar dan sedikit tambahan memori jika setiap nilai memiliki indeks
Jesus Ramos
5
Ada satu alasan lagi selain kinerja spasi dan tulis: menggunakan beberapa indeks untuk satu akses tabel sangat tidak efisien . Itu berarti, meskipun Anda memiliki satu indeks pada setiap kolom, kinerja pemilihan tidak terlalu baik jika beberapa kolom diakses di klausa WHERE. Dalam hal ini, indeks multi-kolom adalah yang terbaik.
Markus Winand
1
jika Anda memiliki tabel dengan 30 bidang, Anda harus benar-benar melihat struktur tabel Anda. Mereka harus bekerja sangat keras.
webs

Jawaban:

122

Indeks membutuhkan ruang di memori (RAM); Indeks yang terlalu banyak atau terlalu besar dan DB harus menukarnya ke dan dari disk. Mereka juga meningkatkan waktu penyisipan dan penghapusan (setiap indeks harus diperbarui untuk setiap bagian data yang dimasukkan / dihapus / diperbarui).

Anda tidak memiliki memori yang tak terbatas. Menjadikannya semua indeks sesuai dengan RAM = bagus.

Anda tidak memiliki waktu yang tidak terbatas. Mengindeks hanya kolom yang Anda butuhkan diindeks meminimalkan hit kinerja masukkan / hapus / perbarui.

Brian Roach
sumber
11
Jawaban santai yang bagus untuk memberikan pemahaman umum, tetapi tidak banyak membantu dalam benar-benar menentukan di mana harus menarik garis pada indeks. Bagaimana kamu bisa tahu? Cukup tambahkan ke kolom WHERED dan berharap yang terbaik?
Andrew
@Andrew satu setengah tahun kemudian, apakah Anda menemukan jawaban atas pertanyaan Anda?
Sinjai
1
@Sinjai Menambahkannya ke kolom biasa di mana mungkin adalah aturan praktis yang baik. Tapi sebaliknya Anda bisa banyak membaca ternyata jika Anda ingin menjadi ahli indeks. misalnya. stackoverflow.com/questions/3049283/…
Andrew
Jangan lupakan ruang disk.
jpmc26
27

Ingatlah bahwa setiap indeks harus diperbarui setiap kali baris diperbarui, disisipkan, atau dihapus. Jadi, semakin banyak indeks yang Anda miliki, semakin lambat kinerja yang Anda miliki untuk operasi tulis.

Selain itu, setiap indeks membutuhkan lebih banyak ruang disk dan ruang memori (saat dipanggil), sehingga berpotensi memperlambat operasi pembacaan juga (untuk tabel besar). Lihat ini

AndyMac
sumber
6
Tautan ini untuk MS SQL Server ; pertanyaan ini untuk MySQL
OMG Ponies
5
@OMG sebagian besar poin di tautan berlaku untuk semua RDBMS utama
RichardTheKiwi
5
@Richard aka cyberkiwi: Indeks tidak dicakup oleh ANSI - merupakan keajaiban setiap vendor telah menggunakan terminologi yang serupa. Tetapi bahkan kemudian, hanya SQL Server dan MySQL yang menggunakan terminologi indeks "clustered" dan "non-clustered" - ini berarti lebih banyak di SQL Server daripada MySQL pada saat itu. Tidak ada jaminan bahwa rekomendasi untuk satu vendor harus diterapkan ke vendor lain.
OMG Ponies
3
@omg 6 poin pertama berlaku untuk dbms apa pun. lewati yang non / clustered, lalu di bawah ini ada lebih banyak poin tentang pengindeksan umum, juga on point. Jika Anda memiliki hal-hal tertentu yang ingin Anda tunjukkan, hubungi mereka. Jika tidak, sepertinya Anda meniadakan semua jawaban yang berasal dari komentar (termasuk jawaban Anda yang dihapus), yang tidak ada yang setuju dengan penilaian Anda.
RichardTheKiwi
10

Anda harus menyeimbangkan kebutuhan CRUD. Menulis ke tabel menjadi lambat. Adapun di mana harus menggambar garis, itu tergantung pada bagaimana data diakses (penyortiran penyortiran, dll.).

Smandoli
sumber
dan juga setiap indeks memerlukan beberapa ruang database
Acanthus
@Acanthus: Hard drive terkecil yang tersedia diukur dalam gigabyte .
OMG Ponies
4
@OMG tapi bukan RAM seperti yang ditunjukkan Brian. tidak pernah merupakan ide yang baik untuk menyimpan lebih dari yang Anda butuhkan. caching data / indeks dalam RAM, media cadangan (versi yang sesuai per tape dll) semuanya dipengaruhi oleh indeks yang tidak berguna
RichardTheKiwi
9
Kelimpahan sumber daya bukanlah alasan untuk pemborosan atau inefisiensi.
Smandoli
6
Benar, tetapi kendala tidak seperti 10+ tahun yang lalu.
OMG Ponies
2

Pengindeksan akan memakan lebih banyak ruang yang dialokasikan baik dari drive dan ram, tetapi juga banyak meningkatkan kinerja. Sayangnya ketika mencapai batas memori, sistem akan mengorbankan ruang drive dan mempertaruhkan kinerja. Praktisnya, Anda tidak boleh mengindeks bidang apa pun yang menurut Anda tidak terlibat dalam segala jenis algoritme penjelajahan data, baik penyisipan maupun penelusuran (klausa WHERE). Tetapi Anda harus melakukannya jika sebaliknya. Secara default Anda harus mengindeks semua bidang. Bidang yang harus Anda pertimbangkan untuk tidak diindeks adalah jika kueri hanya digunakan oleh moderator, kecuali jika mereka juga membutuhkan kecepatan

Lionel Jerinho
sumber
2

jawaban ini adalah pendapat pribadi saya berdasarkan saya menggunakan logika matematika saya untuk menjawab

pertanyaan kedua adalah tentang batas di mana harus berhenti, Pertama mari kita lakukan beberapa perhitungan matematis, misalkan kita memiliki baris N dengan bidang L dalam sebuah tabel jika kita mengindeks semua bidang kita akan mendapatkan tabel indeks baru L di mana setiap tabel akan mengurutkan dalam a Berarti cara data bidang indeks, sekilas jika tabel Anda adalah bobot W itu akan menjadi W * 2 (1 tera akan menjadi 2 tera) jika Anda memiliki 100 tabel besar (saya sudah mengerjakan proyek di mana nomor tabel itu Di sekitar meja 1800) Anda akan membuang 100 kali ruang ini (100 tera), ini jauh dari kata bijak.

Jika kita akan menerapkan indeks di semua tabel, kita harus berpikir tentang pembaruan indeks adalah salah satu pemicu pembaruan semua pembaruan indeks ini adalah pilih semua setara yang tidak diurutkan pada waktunya

dari sini saya simpulkan bahwa Anda dalam skenario ini bahwa jika Anda akan kehilangan waktu ini lebih baik kehilangannya di pilih atau diperbarui karena jika Anda akan memilih bidang yang tidak diindeks Anda tidak akan memicu pemilihan lain pada semua bidang yang tidak diindeks

apa yang akan diindeks?

foreign-keys: adalah suatu keharusan berdasarkan

primary-key: Saya belum yakin tentang itu mungkin jika seseorang membaca ini dapat membantu dalam kasus ini

bidang lain: jawaban alami pertama adalah setengah dari sisa fild mengapa: jika Anda harus mengindeks lebih banyak Anda tidak jauh dari jawaban terbaik jika Anda harus mengindeks lebih sedikit Anda juga tidak jauh karena kami tahu bahwa tidak ada indeks yang buruk dan semua terindeks juga buruk.

dari 3 poin ini saya dapat menyimpulkan bahwa jika kita memiliki bidang L yang terdiri dari kunci K, batasnya harus di suatu tempat dekat ((L-K)/2)+Kkurang lebih oleh L / 10

jawaban ini berdasarkan logika dan nilai pribadi saya

Mohammed Housseyn Taleb
sumber
1

Tidaklah baik untuk mengindeks semua kolom dalam tabel. Meskipun ini akan membuat tabel sangat cepat untuk dibaca, tetapi juga menjadi jauh lebih lambat untuk menulis. Menulis ke tabel yang memiliki setiap kolom terindeks akan melibatkan meletakkan catatan baru di tabel itu dan kemudian memasukkan informasi setiap kolom ke dalam tabel indeksnya sendiri.

Rachid Sakara
sumber
Saya tidak yakin apakah itu akan membuat tabel membaca secepat kilat, terutama jika tabel data hanya 100MB tetapi index.table 300MB atau lebih.
David
Semua yang Anda katakan telah dinyatakan sebelumnya.
Vael Victus