MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Ikhtisar Profiler Basis Data MongoDB

Semua jenis database menghadapi masalah kinerja saat data bertambah. Langkah-langkah sederhana seperti menulis ulang kueri bermasalah atau menganalisis/mengoptimalkan skema basis data dapat meningkatkan kinerja basis data secara drastis. MongoDB menyediakan beberapa fitur luar biasa yang membuat proses ini sangat mudah untuk DBA. Misalnya, Query Profiler, Mongostat, Mongotop, dukungan logging yang baik, dll.

Sebagian besar waktu, itu adalah sistem database yang memutuskan bagaimana kueri akan dieksekusi. Pengguna hanya memberikan detail tentang hasil yang diinginkannya melalui bahasa kueri. Pada artikel ini, kita akan membahas bagaimana kita dapat menggunakan profiler kueri MongoDB untuk menemukan kueri yang lambat dan intensif sumber daya. MongoDB Profiler adalah alat bawaan yang memberi Anda wawasan tingkat kueri yang sebenarnya. Ini memungkinkan Anda untuk menganalisis semua kueri yang dijalankan oleh sistem basis data.

Mengaktifkan/Mengonfigurasi Profiler MongoDB

Umumnya, profiler menyimpan semua data dalam koleksi system.profile yang dapat ditanyakan seperti koleksi MongoDB normal lainnya. Profiler memiliki 3 level pembuatan profil. Secara default, level profiler disetel ke 0 untuk basis data apa pun.

Tingkat 0 Profiler tidak akan mencatat data apa pun
Tingkat 1 Profiler hanya akan mencatat operasi lambat di atas beberapa ambang
Tingkat 2 Profiler akan mencatat semua operasi

Anda dapat menjalankan perintah berikut untuk mendapatkan beberapa informasi tentang profiler.

  • Untuk mendapatkan tingkat pembuatan profil saat ini.

    db.getProfilingLevel()
    Keluaran:
    0
  • Untuk memeriksa status pembuatan profil saat ini

    db.getProfilingStatus()
    Output:
    { "was" : 0, "slowms" : 100 }
  • Untuk menyetel tingkat pembuatan profil

    db.setProfilingLevel(1, 40)
    Output:
    { "was" : 0, "slowms" : 100, "ok" : 1 }

    MongoDB akan mencetak tingkat pembuatan profil lama dan mengembalikan OK yang berarti tingkat pembuatan profil disetel ke 1 sekarang.

    Slowms adalah nilai ambang batas untuk profiler yang berarti profiler akan mencatat semua kueri yang membutuhkan waktu lebih lama daripada nilai ambang untuk dieksekusi.

Memahami Output Profiler

Jalankan perintah ini untuk mendapatkan 1 dokumen dari koleksi system.profile.

db.system.profile.find().limit(1).pretty()

Keluaran:

{
    "op" : "query",
    "ns" : "mydb.Log",
    "query" : {
        "find" : "Log",
        "filter" : {
            "EMP_ID" : "01778"
        }
    },
    "keysExamined" : 0,
    "docsExamined" : 90022,
    "cursorExhausted" : true,
    "keyUpdates" : 0,
    "writeConflicts" : 0,
    "numYield" : 703,
    "locks" : {
        "Global" : {
            "acquireCount" : {
                "r" : NumberLong(1408)
            }
        },
        "Database" : {
            "acquireCount" : {
                "r" : NumberLong(704)
            }
        },
        "Collection" : {
            "acquireCount" : {
                "r" : NumberLong(704)
            }
        }
    },
    "nreturned" : 60,
    "responseLength" : 17676,
    "protocol" : "op_command",
    "millis" : 40,
    "execStats" : {
        "stage" : "COLLSCAN",
        "filter" : {
            "EMP_ID" : {
                "$eq" : "01778"
            }
        },
        "nReturned" : 60,
        "executionTimeMillisEstimate" : 30,
        "works" : 90024,
        "advanced" : 60,
        "needTime" : 89963,
        "needYield" : 0,
        "saveState" : 703,
        "restoreState" : 703,
        "isEOF" : 1,
        "invalidates" : 0,
        "direction" : "forward",
        "docsExamined" : 90022
    },
    "ts" : ISODate("2018-09-09T07:24:56.487Z"),
    "client" : "127.0.0.1",
    "allUsers" : [ ],
    "user" : ""
}

Ini adalah salah satu dokumen dari koleksi system.profile. Kita dapat melihat bahwa itu mengandung banyak informasi yang berguna bagi kita. Mari kita pahami beberapa bidang yang berguna dari dokumen ini.

  • Bidang Op menyimpan jenis operasi.
  • Bidang Ns menyimpan database target dan nama koleksi
  • Bidang kueri menyimpan informasi tentang kueri dan hasil. Hasil akan terpotong jika ukuran dokumen lebih besar dari 50KB
  • keysExamined menyimpan jumlah kunci indeks yang diperiksa oleh DB untuk mengeksekusi kueri
  • docsExamined menyimpan jumlah total dokumen yang diperiksa oleh DB
  • Nreturned menyimpan jumlah dokumen yang dikembalikan oleh kueri
  • Millis berisi waktu aktual dalam milidetik yang diambil oleh kueri ini untuk dieksekusi
  • Ts menyimpan stempel waktu kueri

Kita bisa mendapatkan banyak informasi tentang bagaimana operasi query dilakukan oleh sistem database dengan memeriksa bidang-bidang ini dan menggunakannya untuk mengoptimalkan kinerja database. Misalnya, jika nilai keysExamined lebih besar dari nilai "nreturns" maka ini menunjukkan bahwa DB memindai banyak indeks untuk mendapatkan hasil yang tidak pernah menjadi pertanda baik. Jadi, Anda harus menyesuaikan indeks basis data dengan benar.

Beberapa Sembilan Menjadi DBA MongoDB - Membawa MongoDB ke ProduksiPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan MongoDBUnduh secara Gratis

Kueri Berguna untuk Menganalisis Output Profiler

  1. Kueri yang paling berguna adalah mengurutkan semua dokumen menurut mili untuk mendapatkan 10 kueri lambat teratas.

    db.system.profile.find().sort({millis:-1}).limit(10).pretty();
  2. Temukan semua kueri yang membutuhkan waktu lebih dari 30 milidetik untuk dieksekusi

    db.system.profile.find({millis:{$gt:30}}).pretty()
  3. Temukan 10 kueri agregasi/perintah paling lambat

    db.system.profile.find({op: {$eq: “command” }}).sort({millis:-1}).limit(10).pretty();
  4. Temukan semua operasi yang beberapa dokumennya dipindahkan

    db.system.profile.find({moved:true}).pretty()
  5. Temukan kueri yang melakukan pemindaian besar pada database

    db.system.profile.find({docsExamined:{$gt:10000}}).pretty()
  6. Temukan waktu maksimum dan rata-rata yang diambil oleh setiap jenis operasi menggunakan agregasi

    db.system.profile.aggregate(
    { $group : { 
       _id :"$op", 
       count:{$sum:1},
       "max_time":{$max:"$millis"},
       "avg_time":{$avg:"$millis"}
    }}).pretty()
  7. Temukan waktu maksimum dan rata-rata yang diambil oleh kueri di setiap basis data menggunakan agregasi

    db.system.profile.aggregate(
    { $group : {
      _id :"$ns",
      count:{$sum:1}, 
      "max_time":{$max:"$millis"}, 
      "avg_time":{$avg:"$millis"}  
    }}.pretty()

Kesimpulan

MongoDB Profiler adalah alat yang sangat berguna untuk mendapatkan wawasan tentang bagaimana database menjalankan kueri/perintah apa pun. Jika Anda berencana untuk menggunakan profiler di lingkungan produksi, maka Anda harus melakukan pengujian yang tepat karena hal itu dapat berdampak pada throughput basis data Anda terutama ketika Anda mencatat semua kueri, yaitu tingkat pembuatan profil disetel ke 2. Aspek lain dari penggunaan alat ini adalah menentukan apa lambat berarti. Anda harus memutuskan bahwa semua kueri dapat dianggap lambat. Berdasarkan itu, Anda dapat mengatur ambang minimum untuk mencatat kueri. Ini akan mengurangi dampak penggunaan alat ini pada kinerja DB


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mencampur PostgreSQL dan MongoDB (sebagai backend Django)

  2. Masukkan file json ke mongodb

  3. MongoError:parameter filter harus berupa objek

  4. PHP Mongo Kesalahan membaca dari soket

  5. MongoDB $lt Operator Pipa Agregasi