Seorang kolega saya hari ini menyarankan agar kami memeriksa semua pertanyaan dalam aplikasi kami dan menambahkan indeks yang sesuai.
Saya merasa ini adalah optimasi prematur karena aplikasi kami bahkan belum dirilis. Saya menyarankan untuk memantau permintaan lambat setelah kami tayang dan kemudian menambahkan indeks yang sesuai.
Apa konsensus umum ketika merancang basis data Anda, haruskah Anda menambahkan indeks yang cocok setiap kali Anda menulis kueri baru? Atau lebih baik memantau saja dan melihat bagaimana hasilnya?
database
database-design
indexing
Marco de Jongh
sumber
sumber
Jawaban:
Optimalisasi prematur adalah "mengoptimalkan" sesuatu karena perasaan intuitif yang samar-samar yang, Anda tahu, ini mungkin akan lambat, terutama yang merusak pembacaan kode dan pemeliharaan . Itu tidak berarti dengan sengaja tidak mengikuti praktik-praktik baik yang sudah mapan mengenai kinerja.
Kadang-kadang itu adalah garis yang sulit untuk digambarkan, tetapi saya pasti akan mengatakan bahwa tidak menambahkan indeks sebelum Anda ditayangkan adalah optimasi yang terlalu terlambat ; ini akan menghukum pengadopsi awal - pengguna Anda yang paling bersemangat dan paling penting - dan memberi mereka pandangan negatif tentang produk Anda, yang kemudian akan mereka sebarkan dalam ulasan, diskusi, dll. Memantau pertanyaan untuk menemukan titik nyeri yang perlu diindeks adalah ide yang bagus, tapi saya akan memastikan untuk melakukannya selambat-lambatnya beta.
sumber
karena tidak ada yang mengatakan kualitas seperti membuat pengguna Anda menderita karena kurangnya desain!
Anda harus tahu kueri mana yang perlu indeks ketika Anda mendesain tabel, Anda tahu kolom mana yang dipertanyakan di mana klausa dan bergabung. Ini harus sudah diindeks karena apa yang mungkin tidak terlihat dalam lingkungan hidup dapat dengan cepat menjadi jelas ketika beban atau data yang disimpan meningkat. Apa yang tidak ingin Anda lakukan ketika ini terjadi adalah menampar indeks pada setiap permintaan 'lambat', Anda akan berakhir dengan indeks pada segalanya.
sumber
"Optimalisasi prematur", dalam arti yang merendahkan, berarti optimasi mahal yang mungkin tidak diperlukan. Itu tidak berarti semua optimisasi diterapkan sebelum titik terbaru untuk mencegah kebangkrutan!
Khususnya, itu sah untuk mengoptimalkan berdasarkan tes kinerja sebelum ditayangkan, untuk memastikan Anda dapat memenuhi beberapa persyaratan yang masuk akal (meskipun perkiraan) untuk aplikasi Anda untuk tidak sepenuhnya menyedot.
Minimal Anda harus memuat basis data Anda dengan jumlah data pengujian yang masuk akal dan memeriksa daya tanggap aplikasi Anda. Ini bukan prematur, karena Anda tahu itu akan terjadi, dan itu akan menangkap setiap pertanyaan yang memicu pemindaian yang sangat lambat. Seperti yang dikatakan AE dalam komentar:
Paling tidak, untuk tabel yang direncanakan tumbuh digunakan.
Kemudian sebagai jalan pintas untuk itu, jika Anda memiliki pengalaman yang signifikan dengan mesin database dan Anda sudah merencanakan tes ketika Anda menulis potongan pertama dari kode, maka seringkali Anda akan tahu bahkan tanpa menjalankannya bahwa permintaan Anda menulis akan terlalu lambat tanpa indeks. Tentu saja Anda bebas untuk berpura-pura tidak tahu, dan menonton tes gagal sebelum menambahkan indeks untuk membuatnya lulus, tetapi tidak ada alasan untuk kode yang salah diketahui (karena tidak responsif) untuk ditayangkan.
sumber
Anda tidak dapat memperlakukan pengguna akhir dan lingkungan produksi seperti jaminan kualitas. Dengan kata lain, Anda mengatakan bahwa Anda akan mengetahuinya dalam produksi. Saya pikir itu bukan cara yang benar, dan saya melihat pendekatan itu sangat salah setiap hari .
Anda perlu mengingat satu hal, karena Anda tidak bisa mengecatnya dengan sikat lebar.
Apa beban kerja umum Anda ?
Itu mungkin terdengar jelas atau membosankan, tetapi penting dalam praktiknya. Jika Anda memiliki 10 pertanyaan yang merupakan 98% dari beban kerja Anda (cukup umum, percaya atau tidak), rekomendasi saya akan menjadi analisis yang sulit sebelum produksi . Dengan data yang realistis dan representatif, pastikan 10 pertanyaan itu sebaik mungkin ( sempurna membuang-buang waktu yang berharga, dan hampir tidak dapat dicapai).
Untuk 200 kueri lainnya yang merupakan 2% dari beban kerja , itu adalah pertanyaan yang kemungkinan besar tidak sepadan dengan usaha, dan akan menjadi penyebab keganjilan pemecahan masalah per kasus dalam produksi. Itu juga kenyataan, dan bukan hal yang sangat buruk. Tapi itu tidak berarti mengabaikan praktik terbaik pengindeksan atau membuat asumsi estimasi tentang pengambilan data.
Merupakan praktik yang umum dan baik untuk mengetahui kinerja basis data sebelum produksi. Bahkan, ada posisi yang relatif umum untuk hal semacam ini yang disebut pengembangan DBA .
Tapi...
Beberapa mengambil terlalu jauh dan menjadi gila menambahkan indeks "berjaga-jaga". Seseorang merekomendasikan ini adalah indeks yang hilang? Tambahkan, dan empat variasi lainnya. Itu juga ide yang buruk. Anda tidak hanya perlu memikirkan tentang pengambilan data Anda, tetapi bagaimana dengan modifikasi data? Semakin banyak indeks yang Anda miliki di atas meja, secara umum semakin banyak overhead yang Anda miliki saat Anda memodifikasi data.
Seperti kebanyakan hal, ada keseimbangan yang sehat.
Sebagai catatan kecil yang menyenangkan ... pluralisasi "Indeks"
"Indeks" adalah untuk orang finansial
"Indeks" adalah untuk kita
sumber
Tidak, ini bukan optimasi prematur, tetapi harus dilakukan dengan benar sebagaimana optimasi seharusnya.
Inilah yang akan saya lakukan:
Server database adalah perangkat lunak yang kompleks dan cerdas. Mereka dapat memberi tahu Anda cara mengoptimalkannya jika Anda tahu cara mendengarkan.
Kuncinya adalah untuk mengukur kinerja sebelum dan sesudah mengoptimalkan dan dan biarkan database memberi tahu Anda apa yang dibutuhkan .
sumber
Mengikuti pola yang terbukti untuk masalah yang diketahui (seperti menemukan catatan dengan ID-nya) bukanlah sesuatu yang prematur. Masuk akal.
Yang mengatakan, indeks tidak selalu bisnis yang mudah. Sering kali sulit untuk mengetahui selama fase desain yang akan bergantung pada indeks lalu lintas Anda dan yang akan menghambat operasi penulisan. Jadi, saya berpendapat untuk memanfaatkan beberapa praktik terbaik desain skema "jelas" (gunakan PK yang sesuai untuk pola baca / tulis yang dirancang dan indeks FK); tetapi, jangan meletakkan indeks pada hal lain sampai stress testing Anda menuntutnya.
sumber
Ketika aplikasi Anda dirilis, sudah terlambat.
Tetapi setiap proses pengembangan yang tepat harus mencakup pengujian kinerja.
Gunakan hasil tes kinerja Anda untuk memutuskan indeks mana yang akan ditambahkan, dan verifikasi keefektifannya dengan mengulangi tes kinerja.
sumber
Meskipun saya tidak berpikir setiap query harus dioptimalkan, indeks adalah bagian dari RDBMS sehingga mereka perlu dipertimbangkan sebelum dirilis. Saat Anda menjalankan kueri, tidak seperti bentuk pemrograman lainnya, Anda tidak memberi tahu sistem cara menjalankannya. Mereka mengembangkan rencana mereka sendiri dan hampir selalu mendasarkannya pada ketersediaan indeks. Susunan dan volume data akan dipertimbangkan juga di waktu mendatang.
Berikut adalah beberapa hal yang akan saya pertimbangkan:
Setelah ulasan awal Anda, Anda harus menindaklanjutinya dengan beberapa pertimbangan kapan Anda harus meninjau ini lagi dan bagaimana Anda akan dapat mengumpulkan informasi untuk melakukan ini (memantau penggunaan, mendapatkan salinan data klien, dll.).
Saya menyadari Anda tidak ingin mengoptimalkan secara prematur, tetapi hampir pasti Anda akan memiliki kinerja yang buruk tanpa mengindeks database Anda. Dengan menyingkirkan hal ini, Anda dapat menentukan apakah ada area lain yang menyebabkan masalah kinerja.
sumber
Itu juga tergantung pada berapa banyak pengguna yang Anda harapkan. Anda pasti harus melakukan beberapa pengujian beban dan memastikan database Anda dapat menjaga 10s hingga 100s hingga 1000s permintaan simultan. Sekali lagi, itu tergantung pada seberapa banyak lalu lintas yang Anda harapkan, dan area apa yang Anda harapkan lebih banyak digunakan daripada yang lain.
Secara umum, saya akan menyelaraskan area yang saya harapkan paling banyak dikunjungi pengguna. Maka saya akan menyesuaikan apa pun yang lambat dari sudut pandang pengalaman pengguna. Setiap kali pengguna harus menunggu sesuatu, mereka mendapatkan pengalaman buruk dan mungkin ditolak. Tidak baik!
sumber
Ini adalah praktik yang baik untuk mengidentifikasi kolom mana yang benar-benar membutuhkan indeks dengan beberapa analisis dimuka. Ada risiko nyata penurunan kinerja secara bertahap atau tidak terduga dalam produksi karena ukuran basis data meningkat jika Anda sama sekali tidak memiliki indeks. Situasi yang ingin Anda hindari adalah di mana kueri yang biasa dijalankan memerlukan pemindaian sejumlah besar baris tabel. Ini bukan optimasi prematur untuk menambahkan indeks ke kolom kritis karena Anda memiliki banyak informasi yang diperlukan tersedia dan perbedaan kinerja potensial yang signifikan (urutan besarnya). Ada juga situasi di mana manfaat indeks kurang jelas atau lebih tergantung pada data - Anda mungkin dapat menunda memutuskan untuk beberapa kasus ini.
Beberapa pertanyaan yang perlu Anda tanyakan adalah:
Jika tabel selalu kecil (katakanlah <100 baris), itu bukan bencana jika database harus memindai seluruh tabel. Mungkin bermanfaat untuk menambahkan indeks, tetapi ini membutuhkan sedikit lebih banyak keahlian atau pengukuran untuk menentukan.
Jika kueri dijalankan jarang dan tidak memiliki persyaratan waktu respons yang ketat (misalnya pembuatan laporan) dan jumlah baris tidak besar, maka mungkin cukup aman untuk menunda menambahkan indeks. Sekali lagi, keahlian atau pengukuran dapat membantu mengetahui apakah itu akan bermanfaat.
Jika kueri ini sering dijalankan dan menyentuh tabel dengan banyak baris, maka Anda harus secara serius mempertimbangkan untuk menambahkan indeks terlebih dahulu. Jika Anda tidak yakin apakah ini kasus untuk kueri, Anda dapat mengisi basis data dengan jumlah data yang realistis, lalu melihat rencana kueri.
sumber