Apakah "CREATE INDEX` di MySQL adalah Operasi Linier?


20

Yang saya maksud adalah sebagai berikut:

Jika membuat indeks di atas meja dengan nbaris membutuhkan twaktu. Akan membuat indeks pada tabel yang sama dengan 1000*nwaktu kira-kira 1000*t.

Yang saya coba capai adalah memperkirakan waktu yang diperlukan untuk membuat indeks pada basis data produksi dengan membuat indeks yang sama pada basis data uji yang jauh lebih kecil.

Jawaban:


16

Penciptaan indeks pada dasarnya adalah semacam operasi , sehingga paling tidak memiliki kompleksitas pertumbuhan urutan n log nrata-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.


7

Juga perlu dicatat adalah bahwa jika Anda dapat membagi spindel untuk indeks dari spindel untuk tabel maka Anda akan dapat bekerja dari dua disk sekaligus (masih terbatas pada kecepatan pengontrol disk di tengah, jika sebuah RAID atau sejenisnya, tetapi tetap saja akan lebih cepat dari satu disk).

Saya menyadari bahwa membuat indeks bukan sepenuhnya operasi simul-baca-tulis, tetapi mempercepat banyak hal.

CAVEAT: Saya sendiri seorang pria MSSQL, jadi saya tidak yakin tentang MySQL, tetapi saya harus membayangkan bahwa konsep pemisahan spindel tidak spesifik untuk SQLServer dan Oracle (di mana saya pernah mendengarnya berbicara tentang sana juga, IIRC ). Saya tidak akan tahu bagaimana cara mengatur konsep itu. Tetapi dalam istilah SQLServer itu berarti memiliki kelompok fileg terpisah selain PRIMARYdan menempatkan indeks pada filegroup lain, dengan filegroup lain ditugaskan untuk satu set spindle tidak melibatkan PRIMARY(diberikan penempatan spindle vs filegroup adalah cerita lain sama sekali)


1
Cukup banyak hal yang sama di Oracle - hanya grup file yang disebut tablespace
Joe


1

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.