Penciptaan indeks pada dasarnya adalah semacam operasi , sehingga paling tidak memiliki kompleksitas pertumbuhan urutan n log n
rata-rata (Anda mungkin menemukan itu lebih baik dalam beberapa kasus, dan tidak mungkin melakukan jauh lebih buruk).
Jika semua halaman data relevan Anda masuk ke dalam RAM dan sudah ada dalam RAM, dan indeks akan cocok juga, dan DBMS Anda tidak memaksa halaman indeks untuk ditulis sebelum pembuatan selesai (jadi blok indeks tidak diperbarui pada disk beberapa kali selama operasi), maka kecepatan penulisan indeks yang dihasilkan ke disk akan lebih signifikan daripada waktu yang dibutuhkan untuk melakukan pengurutan - sehingga Anda mungkin menemukan Anda lebih dekat dengan hubungan linear antara jumlah baris dan waktu pembuatan indeks - tetapi jika Anda menganggap kasus yang lebih buruk, Anda cenderung tidak akan terkejut!
Ingatlah bahwa kecuali Anda tidak akan menghentikan akses ke basis data produksi selama operasi, indeks apa pun yang dibuat akan bersaing untuk bandwidth IO dan / atau mengunci dengan aktivitas lain, jadi Anda harus mencoba memperhitungkan ini jika Anda melakukan tes estimasi waktu Anda pada sistem lain bahkan jika itu dikonfigurasi secara identik.
Jika pertanyaan ini ditanyakan sekitar 6 tahun yang lalu, saya akan dengan tegas mengatakan TIDAK karena akan berkaitan dengan MySQL 4.x. Namun, MySQL 5.x tidak melakukan pembuatan indeks secara linear hari ini. Saya hanya punya pengalaman nostalgia menjelaskan ini dalam jawaban saya untuk pertanyaan sebelumnya.
sumber
Tergantung.
Variabel # 1: Jika MySQL memilih untuk membuat indeks dengan cepat, atau menunggu sampai semua data masuk, maka lakukan pengurutan, dll, untuk membuat indeks. Catatan: indeks UNIQUE (saya pikir) harus dibangun dengan cepat sehingga UNIQUEness dapat diverifikasi. KUNCI UTAMA untuk InnoDB disimpan dengan data (atau Anda dapat menyatakannya sebaliknya), sehingga HARUS dibangun secara acak.
Variabel # 2: Indeks melacak data (mis. AUTO_INCREMENT atau timestamp) versus acak (GUID, MD5), atau di suatu tempat di antaranya (nomor bagian, nama, friend_id).
Variabel # 3 (jika indeks dibangun dengan cepat): Indeks mungkin cocok dengan cache (key_buffer atau innodb_buffer_pool), atau mungkin tumpah ke disk.
Indeks yang melacak data efisien, dan hampir linier, terlepas dari jawaban # 1.
Id acak adalah rasa sakit. Jika indeks tidak muat di cache, waktu pembuatannya akan jauh lebih buruk daripada linear, terlepas dari variabel lainnya. (Saya tidak setuju dengan Rolando dalam kasus ini.) Tabel InnoDB besar dengan GUID untuk PK sangat lambat untuk MASUK ke dalam - rencana pada 100 baris / detik untuk disk biasa; mungkin 1000 jika Anda memiliki SSD. LOAD DATA dan INSERT batched tidak akan membuat Anda melewati kelambatan penyimpanan acak.
3,53 hingga 5,6 - tidak banyak yang berubah.
Banyak spindle? RAID striping lebih baik di hampir semua situasi daripada menetapkannya secara manual di sini dan di sana. Pemisahan manual menyebabkan situasi tidak seimbang - pemindaian tabel macet di disk data; operasi indeks saja terjebak pada disk indeks; permintaan tunggal pertama-tama mengenai disk indeks, kemudian disk data (tidak ada tumpang tindih); dll.
sumber