{"title":"Optimisasi akses basisdata","version":"1.11","locale":"id","docname":"topics/db/optimization","url":"/id/1.11/topics/db/optimization/","canonical":"https://djangodocs.dev/id/1.11/topics/db/optimization/","summary":"Lapisan basisdata Django menyediakan beragam cara membantu pengembang mendapatkan sebagian dari basisdata mereka. DOkumen ini mengumpulkan bersama-sama tautan ke…","html":"<h1>Optimisasi akses basisdata<a class=\"heading-anchor\" href=\"#database-access-optimization\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Lapisan basisdata Django menyediakan beragam cara membantu pengembang mendapatkan sebagian dari basisdata mereka. DOkumen ini mengumpulkan bersama-sama tautan ke dokumentasi bersangkutan, dan menambah beraagam tip, mengorganisasikan dibawah sejumlah dari kepala yang meringkaskan langkah-langkah diambil ketika berusaha mengoptimalkan penggunaan basisdata anda.</p>\n<section id=\"profile-first\">\n<h2>Profil dahulu<a class=\"heading-anchor\" href=\"#profile-first\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sebagai praktik pemrograman umum, ini terjadi tanpa perkataan. Temukan <span class=\"xref std std-ref\">what queries you are doing and what they are costing you 1</span>. Anda mungkin juga ingin menggunakan proyek luar seperti <a class=\"reference external\" href=\"https://github.com/jazzband/django-debug-toolbar/\">django-debug-toolbar</a>, atau alat yang mengamati basisdata anda secara langsung.</p>\n<p>Ingat bahwa anda mungkin dioptimalkan untuk kecepatan atau memori atau keduanya, tergantung pada persyaraan anda. Terkadang mengoptimalkan untuk satu akan merugikan ke yang lain, tetapi terkadang mereka akan membantu satu sama lain. Juga, pekerjaan itu selesai oleh pengolahan basisdata mungkin tidak mempunyai biaya sama (kepada anda) seperti sama banyak dari pekerjaan selesai dalam pengolahan Python anda. Itu terserah anda memutuskan apa prioritas anda, dimana keseimbangan harus berbohong, dan profil semua dari ini seperti diwajibkan sejak ini akan bergantung pada aplikasi anda dan peladen.</p>\n<p>Dengan apapun yang mengikuti, ingat untuk menggambarkan raut muka setelah setiap perubahan untuk memastikan bahwa perubahan adalah menguntungkan, dan keuntungan cukup besar diberikan menurunkan dalam kesiapan kode anda. <strong>Semua</strong> dari saran-saran dibawah datang dengan surat keberatan yang dalam keadaan anda prinsip umum mungkin tidak berlaku, atau mungkin bahkan dibalikkan.</p>\n</section>\n<section id=\"use-standard-db-optimization-techniques\">\n<h2>Gunakan teknik-teknik optimalisasi DB standar<a class=\"heading-anchor\" href=\"#use-standard-db-optimization-techniques\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>...termasuk:</p>\n<ul class=\"simple\">\n<li><p><a class=\"reference external\" href=\"https://en.wikipedia.org/wiki/Database_index\">Indexes</a>. Ini adalah prioritas nomor satu, <em>setelah</em> anda menentukan dari menggambarkan indeks apa harus ditambahkan. Gunakan <a class=\"reference internal\" href=\"/id/1.11/ref/models/fields/#django.db.models.Field.db_index\" title=\"django.db.models.Field.db_index\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Field.db_index</span></code></a> atau <a class=\"reference internal\" href=\"/id/1.11/ref/models/options/#django.db.models.Options.index_together\" title=\"django.db.models.Options.index_together\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.index_together</span></code></a> untuk menambah ini dari Django. Pertimbangkan menambahkan indeks ke bidang yang anda sangat sering meminta menggunakan <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.filter\" title=\"django.db.models.query.QuerySet.filter\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">filter()</span></code></a>, <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.exclude\" title=\"django.db.models.query.QuerySet.exclude\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">exclude()</span></code></a>, <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a>, dll. ketika indeks mungkin membantu anda mempercepat pencarian. Catat bahwa menentukan indeks terbaik adalah topik berdiri-sendiri-basisdata rumit yang akan bergantung pada aplikasi tertentu anda. Diatas dari merawat sebuah indeks mungkin lebih penting dari keuntungan dalam kecepatan.</p></li>\n</ul>\n<ul class=\"simple\">\n<li><p>Penggunaan sesuai dari jenis-jenis bidang</p></li>\n</ul>\n<p>Kami akan menganggap anda telah melakukan hal-hal tidak jelas diatas. Sisa dari dokumen ini fokus pada bagaimana menggunakan Django dalam seperti itu yang anda tidak melakukan pekerjaan tidak penting. Dokumen ini tidak mengalamatkan teknik-teknik optimalisasi lain yang berlaku ke semua tindakan, seperti <span class=\"xref std std-doc\">general purpose caching 1</span>.</p>\n</section>\n<section id=\"understand-querysets\">\n<h2>Memahami <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#understand-querysets\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Memahami <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/\"><span class=\"doc\">QuerySets</span></a> adalah vital untuk mendapatkan penampilan baik dengan kode sederhana. Khususnya:</p>\n<section id=\"understand-queryset-evaluation\">\n<h3>Memahami penilaian <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code><a class=\"heading-anchor\" href=\"#understand-queryset-evaluation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Untuk menghindari masalah penampilan, sangatlah penting memahami:</p>\n<ul class=\"simple\">\n<li><p>itu <a class=\"reference internal\" href=\"/id/1.11/topics/db/queries/#querysets-are-lazy\"><span class=\"std std-ref\">QuerySets malas</span></a>.</p></li>\n<li><p>ketika <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#when-querysets-are-evaluated\"><span class=\"std std-ref\">mereka dinilai</span></a>.</p></li>\n<li><p>bagaimana <a class=\"reference internal\" href=\"/id/1.11/topics/db/queries/#caching-and-querysets\"><span class=\"std std-ref\">data ditahan dalam memori</span></a>.</p></li>\n</ul>\n</section>\n<section id=\"understand-cached-attributes\">\n<h3>Memahami atribut tembolok<a class=\"heading-anchor\" href=\"#understand-cached-attributes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Seperti menyimpan sementara keseluruhan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, ada penyimpanan sementara dari hasil atribut pada obyek ORM. Secara umum, atribut-atribut tidak dapat dipanggil akan disimpan sementara. Sebagai contoh, menganggap <span class=\"xref std std-ref\">example Weblog models 1</span>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">blog</span>   <span class=\"c1\"># Blog object is retrieved at this point</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">blog</span>   <span class=\"c1\"># cached version, no DB access</span>\n</code></pre></div>\n<p>Tetapi secara umum, atribut callable menyebabkan pencarian DB setiap waktu:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">1</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">authors</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>   <span class=\"c1\"># query performed</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">authors</span><span class=\"o\">.</span><span class=\"n\">all</span><span class=\"p\">()</span>   <span class=\"c1\"># query performed again</span>\n</code></pre></div>\n<p>Hati-hati ketika membaca kode cetakan - sistem cetakan tidak mengizinkan penggunaan tanda kurun, tetapi akan memanggil callable secara otomatis, memnyembunyikan perbedaan diatas.</p>\n<p>Berhati-hatilan dengan sifat penyesuaian anda sendiri - itu terserah anda menerapkan cache ketika dibutuhkan, sebagai contoh menggunakan penghias <a class=\"reference internal\" href=\"/id/1.11/ref/utils/#django.utils.functional.cached_property\" title=\"django.utils.functional.cached_property\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">cached_property</span></code></a>.</p>\n</section>\n<section id=\"use-the-with-template-tag\">\n<h3>Gunakan etiket cetakan <code class=\"docutils literal notranslate\"><span class=\"pre\">with</span></code><a class=\"heading-anchor\" href=\"#use-the-with-template-tag\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Untuk menggunakan perilaku cache dari <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code>, anda mungkin butuh menggunakan etiket cetakan  <a class=\"reference internal\" href=\"/id/1.11/ref/templates/builtins/#std-templatetag-with\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">with</span></code></a>.</p>\n</section>\n<section id=\"use-iterator\">\n<h3>Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">iterator()</span></code><a class=\"heading-anchor\" href=\"#use-iterator\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ketika anda mempunyai banyak obyek, perilaku cache dari <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dapat menyebabkan sejumlah besar memori digunakan. Dalam kasus ini, <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.iterator\" title=\"django.db.models.query.QuerySet.iterator\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">iterator()</span></code></a> mungkin membantu.</p>\n</section>\n</section>\n<section id=\"do-database-work-in-the-database-rather-than-in-python\">\n<h2>Lakukan pekerjaan basisdata di basisdata daripada di Python<a class=\"heading-anchor\" href=\"#do-database-work-in-the-database-rather-than-in-python\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Sebagai contoh:</p>\n<ul class=\"simple\">\n<li><p>Pada paling tingkat dasar, gunakan <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#queryset-api\"><span class=\"std std-ref\">filter and exclude</span></a> melakukan penyaringan di basisdata</p></li>\n<li><p>Gunakan <a class=\"reference internal\" href=\"/id/1.11/ref/models/expressions/#django.db.models.F\" title=\"django.db.models.F\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">F</span> <span class=\"pre\">expressions</span></code></a> untukmenyaring berdasarkan pada bidang-bidang lain dalam model sama.</p></li>\n<li><p>Gunakan <a class=\"reference internal\" href=\"/id/1.11/topics/db/aggregation/\"><span class=\"doc\">annotate to do aggregation in the database</span></a>.</p></li>\n</ul>\n<p>Jika ini tidak cukup membangkitkan SQL yang anda butuhkan:</p>\n<section id=\"use-rawsql\">\n<h3>Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">RawSQL</span></code><a class=\"heading-anchor\" href=\"#use-rawsql\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Sedikit ringan tetapi metode lebih kuat adalah pernyataan <a class=\"reference internal\" href=\"/id/1.11/ref/models/expressions/#django.db.models.expressions.RawSQL\" title=\"django.db.models.expressions.RawSQL\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">RawSQL</span></code></a>, yangmengizinkan beberapa SQL secara jelas ditambahkan ke permintaan. Jika itu masih tidak cukup kuat:</p>\n</section>\n<section id=\"use-raw-sql\">\n<h3>Gunakan SQL mentah<a class=\"heading-anchor\" href=\"#use-raw-sql\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Tulis <span class=\"xref std std-doc\">custom SQL to retrieve data or populate models 1</span> anda sendiri. Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">django.db.connection.queries</span></code> untuk menemukan apa yang Django sedang tulis untuk anda dan mulai dari sana.</p>\n</section>\n</section>\n<section id=\"retrieve-individual-objects-using-a-unique-indexed-column\">\n<h2>Mengambil obyek tersendiri menggukan sebuah unik, kolom indeks<a class=\"heading-anchor\" href=\"#retrieve-individual-objects-using-a-unique-indexed-column\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ada dua alasan untuk menggunakan kolom dengan <a class=\"reference internal\" href=\"/id/1.11/ref/models/fields/#django.db.models.Field.unique\" title=\"django.db.models.Field.unique\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">unique</span></code></a> atau <a class=\"reference internal\" href=\"/id/1.11/ref/models/fields/#django.db.models.Field.db_index\" title=\"django.db.models.Field.db_index\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">db_index</span></code></a> ketika menggunakan <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.get\" title=\"django.db.models.query.QuerySet.get\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">get()</span></code></a> untuk mengambil obyek tersendiri. Pertama, permintaan akan lebih cepat karena indeks basisdata pokok. Juga, permintaan dapat berjalan lebih lambat jika banyak obyek mencocokan pencarian; memiliki batasan unik pada kolom menjamin ini tidak pernah terjadi.</p>\n<p>Jadi menggunakan <a class=\"reference internal\" href=\"/id/1.11/topics/db/queries/#queryset-model-example\"><span class=\"std std-ref\">example Weblog models</span></a>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"nb\">id</span><span class=\"o\">=</span><span class=\"mi\">10</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>akan lebih cepat daripada:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s2\">&quot;News Item Title&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>karena <code class=\"docutils literal notranslate\"><span class=\"pre\">id</span></code> diindeks oleh basisdata dan dijamin menjadi unik.</p>\n<p>Melakukan berikut berpotensi sangat lambat:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">entry</span> <span class=\"o\">=</span> <span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">headline__startswith</span><span class=\"o\">=</span><span class=\"s2\">&quot;News&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Pertama-tama, <code class=\"docutils literal notranslate\"><span class=\"pre\">headline</span></code> tidak diindeks, yang akan membuat pengambilan pokok basisdata lebih lambat.</p>\n<p>Kedua, pencarian tidak menjamin hanya satu obyek akan dikembalikan. Jika permintaan cocok lebih dari satu obyek, itu akan mengambil dan memindahkan semua dari mereka dari basisdata. Hukuman ini dapat besar jika ratusan atau ribuan dari rekaman dikembalikan. Hukuman akan digabungkan jika basisdata berada pada peladen berbeda, dimana overhead jaringan dan latensi memainkan faktor.</p>\n</section>\n<section id=\"retrieve-everything-at-once-if-you-know-you-will-need-it\">\n<h2>Mengambil semuanya sekaligus jika anda mengetahui anda akan membutuhkannya<a class=\"heading-anchor\" href=\"#retrieve-everything-at-once-if-you-know-you-will-need-it\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Mengenai basisdata beberapa kali untuk bagian-bagian berbeda dari 'set' tunggal data yang anda akan butuh semua bagian, secara umum, kurang efisien dari mengambil itu semua dalam satu permintaan. Ini khususnya penting jika anda mempunyai sebuah permintaan yang dijalankan dalam putaran, dan dapat karena itu berakhir melakukan banyak permintaan basisdata, ketika hanya satu dibutuhkan. Jadi:</p>\n<section id=\"use-queryset-select-related-and-prefetch-related\">\n<h3>Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.select_related()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-select-related-and-prefetch-related\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Memahami <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.select_related\" title=\"django.db.models.query.QuerySet.select_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">select_related()</span></code></a> dan <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.prefetch_related\" title=\"django.db.models.query.QuerySet.prefetch_related\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">prefetch_related()</span></code></a> sepenuhnya, dan menggunakan mereka:</p>\n<ul class=\"simple\">\n<li><p>in <a class=\"reference internal\" href=\"/id/1.11/topics/db/managers/\"><span class=\"doc\">managers and default managers</span></a> where\nappropriate. Be aware when your manager is and is not used; sometimes this is\ntricky so don't make assumptions.</p></li>\n<li><p>in view code or other layers, possibly making use of\n<a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.prefetch_related_objects\" title=\"django.db.models.prefetch_related_objects\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">prefetch_related_objects()</span></code></a> where needed.</p></li>\n</ul>\n</section>\n</section>\n<section id=\"don-t-retrieve-things-you-don-t-need\">\n<h2>Jangan mengambil hal yang tidak anda butuhkan<a class=\"heading-anchor\" href=\"#don-t-retrieve-things-you-don-t-need\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<section id=\"use-queryset-values-and-values-list\">\n<h3>Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.values()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">values_list()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-values-and-values-list\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Ketika anda hanya ingin nilai-nilai <code class=\"docutils literal notranslate\"><span class=\"pre\">dict</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">list</span></code>, dan tidak butuh obyek model ORM, buat penggunaan sesuai dari <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">values()</span></code></a>. Ini dapat berguna untuk mengganti obyek model dalam kode cetakan - selama dictionary anda sokong mempuyai atribut sama seperti itu digunakan dalam cetakan, anda baik-baik saja.</p>\n</section>\n<section id=\"use-queryset-defer-and-only\">\n<h3>Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.defer()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-defer-and-only\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Gunakan <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.defer\" title=\"django.db.models.query.QuerySet.defer\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">defer()</span></code></a> dan <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.only\" title=\"django.db.models.query.QuerySet.only\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">only()</span></code></a> jika ada kolom basisdata anda ketahui bahwa anda tidak butuh (atau tidak butuh dalam kebanyakan kasus) untuk menghindari memuatkan mereka. Catat bahwa jika anda <em>melakukan</em> menggunakan mereka, ORM akan harus pergi dan mendapatkan mereka dalam permintaan terpisah, membuat ini pesimis jika anda menggunakan itu secara tidak benar.</p>\n<p>Juga, waspada bahwa ada beberapa (sedikit tambahan) overhead terjadi didalam Django ketika membangun model dengan bidang-bidang yang ditangguhkan. Jangan terlalu agresif dalam menangguhkan bidang-bidang tanpa memprofilkan sebagai basisdata harus membaca kebanyakan bukan-teks, data bukan-VARCHAR dari cakram untuk baris tunggal dalam hasil, bahkan jika itu berakhir hanya menggunakan sedikit kolom. Metode <code class=\"docutils literal notranslate\"><span class=\"pre\">defer()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">only()</span></code> paling berguna ketika anda dapat menghindari memuat banyak data teks atau untuk bidang yang mungkin mengambil banyak pengolahan untuk merubah kembali ke Python. Seperti biasanya, profilkan dahulu, kemudian optimalkan.</p>\n</section>\n<section id=\"use-queryset-count\">\n<h3>Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.count()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-count\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>..jika anda hanya ingin menghitung, daripada melakukan <code class=\"docutils literal notranslate\"><span class=\"pre\">len(queryset)</span></code>.</p>\n</section>\n<section id=\"use-queryset-exists\">\n<h3>Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.exists()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-exists\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>...jika anda hanya ingin menemukan jika setidaknya satu hasil ada, daripada <code class=\"docutils literal notranslate\"><span class=\"pre\">if</span> <span class=\"pre\">queryset</span></code>.</p>\n<p>Tetapi:</p>\n</section>\n<section id=\"don-t-overuse-count-and-exists\">\n<span id=\"overuse-of-count-and-exists\"></span><h3>Jangan berlebihan <code class=\"docutils literal notranslate\"><span class=\"pre\">count()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">exists()</span></code><a class=\"heading-anchor\" href=\"#don-t-overuse-count-and-exists\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika anda akan butuh data lain dari QuerySet, cukup nilai itu.</p>\n<p>Sebagai contoh, menganggap sebuah model Email yang mempunyai atribut <code class=\"docutils literal notranslate\"><span class=\"pre\">body</span></code> dan hubungan many-to-many pada User, kode cetakan berikut adalah optimal:</p>\n<div class=\"code-block\" data-language=\"html+django\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Django template</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Django template code\"><code><span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">display_inbox</span> <span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span> <span class=\"k\">with</span> <span class=\"nv\">emails</span><span class=\"o\">=</span><span class=\"nv\">user.emails.all</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">if</span> <span class=\"nv\">emails</span> <span class=\"cp\">%}</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>You have <span class=\"cp\">{{</span> <span class=\"nv\">emails</span><span class=\"o\">|</span><span class=\"nf\">length</span> <span class=\"cp\">}}</span> email(s)<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n      <span class=\"cp\">{%</span> <span class=\"k\">for</span> <span class=\"nv\">email</span> <span class=\"k\">in</span> <span class=\"nv\">emails</span> <span class=\"cp\">%}</span>\n        <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span><span class=\"cp\">{{</span> <span class=\"nv\">email.body</span> <span class=\"cp\">}}</span><span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n      <span class=\"cp\">{%</span> <span class=\"k\">endfor</span> <span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">else</span> <span class=\"cp\">%}</span>\n      <span class=\"p\">&lt;</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>No messages today.<span class=\"p\">&lt;/</span><span class=\"nt\">p</span><span class=\"p\">&gt;</span>\n    <span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span> <span class=\"k\">endwith</span> <span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span> <span class=\"k\">endif</span> <span class=\"cp\">%}</span>\n</code></pre></div>\n<p>DIa optimal karena:</p>\n<ol class=\"arabic simple\">\n<li><p>Sejak QuerySet adalah lazy, ini tidak melakukan permintaan basisdata jika 'display_inbox' adalah False.</p></li>\n<li><p>Penggunaan <a class=\"reference internal\" href=\"/id/1.11/ref/templates/builtins/#std-templatetag-with\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">with</span></code></a> berarti bahwa kami menyimpan <code class=\"docutils literal notranslate\"><span class=\"pre\">user.emails.all</span></code>  dalam sebuah variabel untuk penggunaan akhir, mengizinkan cache itu untuk digunakan-kembali.</p></li>\n<li><p>Baris <code class=\"docutils literal notranslate\"><span class=\"pre\">{%</span> <span class=\"pre\">if</span> <span class=\"pre\">emails</span> <span class=\"pre\">%}</span></code> menyebabkan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.__bool__()</span></code> dipanggil, yang menyebabkan permintaan <code class=\"docutils literal notranslate\"><span class=\"pre\">user.emails.all()</span></code> dijalankan pada basisdata, dan setidaknya baris pertama dirubah menjadi obyek ORM. Jika tidak ada hasil apapun, itu akan mengembalikan False, sebaliknya True.</p></li>\n<li><p>Penggunaan <code class=\"docutils literal notranslate\"><span class=\"pre\">{{</span> <span class=\"pre\">emails|length</span> <span class=\"pre\">}}</span></code> memanggil <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.__len__()</span></code>, mengisi sisa dari cache tanpa melakukan permintaan lain.</p></li>\n<li><p>Putaran <a class=\"reference internal\" href=\"/id/1.11/ref/templates/builtins/#std-templatetag-for\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">for</span></code></a> berulang terhadap cache sudah diisi.</p></li>\n</ol>\n<p>Dalam jumlah, kode ini melakukan baik satu atau nol permintaan basisdata. Satu-satunya optimalisasi kesengajaan dilakukan adalah menggunakan etiket <a class=\"reference internal\" href=\"/id/1.11/ref/templates/builtins/#std-templatetag-with\"><code class=\"xref std std-ttag docutils literal notranslate\"><span class=\"pre\">with</span></code></a>. Menggunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.exists()</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.count()</span></code> pada titik apapun akan menyebabkan tambahan permintaan.</p>\n</section>\n<section id=\"use-queryset-update-and-delete\">\n<h3>Gunakan <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet.update()</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code><a class=\"heading-anchor\" href=\"#use-queryset-update-and-delete\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Daripada mengambil memuat obyek, setel beberapa nilai, dan simpan mereka masing-masing, gunakan pernyataan SQL UPDATE dalam jumlah besar, melalui <span class=\"xref std std-ref\">QuerySet.update() 1</span>. Demikian pula, lakukan <span class=\"xref std std-ref\">bulk deletes 2</span> dimana memungkinkan.</p>\n<p>Catat, bagaimanapun, metode pembaharuan jumlah besar ini tidak dapat memanggil metode <code class=\"docutils literal notranslate\"><span class=\"pre\">save()</span></code> atau <code class=\"docutils literal notranslate\"><span class=\"pre\">delete()</span></code> dari masing-masing instance, yang berarti bahwa perilaku penyesuaian apapun anda telah tambahkan untuk metode-metode ini tidak akan dijalankan, termasuk apapun didorong dari obyek basisdata biasa <span class=\"xref std std-doc\">signals 1</span>.</p>\n</section>\n<section id=\"use-foreign-key-values-directly\">\n<h3>Menggunakan nilai foreign key secara langsung<a class=\"heading-anchor\" href=\"#use-foreign-key-values-directly\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Jika anda hanya butuh nilai foreign key, gunakan nilai foreign key yang sudah pada obyek anda telah dapatkan, daripada mendapatkan keseluruhan obyek terkait dan mengambil primary key nya, yaitu. lakukan:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">blog_id</span>\n</code></pre></div>\n<p>dari pada:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">entry</span><span class=\"o\">.</span><span class=\"n\">blog</span><span class=\"o\">.</span><span class=\"n\">id</span>\n</code></pre></div>\n</section>\n<section id=\"don-t-order-results-if-you-don-t-care\">\n<h3>Jangan urutkan hasil jika anda tidak peduli<a class=\"heading-anchor\" href=\"#don-t-order-results-if-you-don-t-care\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Pengurutan tidak bebas; setiap bidang yang diurutkan adalah sebuah operai basisdata harus dilakukan. Jika sebuah model awal mengurutkan (<a class=\"reference internal\" href=\"/id/1.11/ref/models/options/#django.db.models.Options.ordering\" title=\"django.db.models.Options.ordering\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">Meta.ordering</span></code></a>) dan anda tidak membutuhkannya, pindahkan dia pada <code class=\"docutils literal notranslate\"><span class=\"pre\">QuerySet</span></code> dengan memanggil <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">order_by()</span></code></a> dengan tidak ada parameter.</p>\n<p>Menambahkan indeks ke basisdata anda mungkin membantu meningkatkan penampilan pengurutan.</p>\n</section>\n</section>\n<section id=\"insert-in-bulk\">\n<h2>Masuk dalam bulk<a class=\"heading-anchor\" href=\"#insert-in-bulk\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Ketika membuat obyek-obyek, dimana memungkinkan, gunakan metode <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create\" title=\"django.db.models.query.QuerySet.bulk_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">bulk_create()</span></code></a> untuk mengurangi sejumlah permintaan SQL. Sebagai contoh:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">bulk_create</span><span class=\"p\">([</span>\n    <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;This is a test&#39;</span><span class=\"p\">),</span>\n    <span class=\"n\">Entry</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;This is only a test&#39;</span><span class=\"p\">),</span>\n<span class=\"p\">])</span>\n</code></pre></div>\n<p>...adalah lebih baik untuk:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;This is a test&#39;</span><span class=\"p\">)</span>\n<span class=\"n\">Entry</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">create</span><span class=\"p\">(</span><span class=\"n\">headline</span><span class=\"o\">=</span><span class=\"s1\">&#39;This is only a test&#39;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Catat bahwa ada angka dari <a class=\"reference internal\" href=\"/id/1.11/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create\" title=\"django.db.models.query.QuerySet.bulk_create\"><code class=\"xref py py-meth docutils literal notranslate\"><span class=\"pre\">caveats</span> <span class=\"pre\">to</span> <span class=\"pre\">this</span> <span class=\"pre\">method</span></code></a>, jadi pastikan dia sesuai untuk kasus digunakan anda.</p>\n<p>Ini juga berlaku pada <a class=\"reference internal\" href=\"/id/1.11/ref/models/fields/#django.db.models.ManyToManyField\" title=\"django.db.models.ManyToManyField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ManyToManyFields</span></code></a>, demikian:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">my_band</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">me</span><span class=\"p\">,</span> <span class=\"n\">my_friend</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...adalah lebih baik untuk:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">my_band</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">me</span><span class=\"p\">)</span>\n<span class=\"n\">my_band</span><span class=\"o\">.</span><span class=\"n\">members</span><span class=\"o\">.</span><span class=\"n\">add</span><span class=\"p\">(</span><span class=\"n\">my_friend</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>...dimana <code class=\"docutils literal notranslate\"><span class=\"pre\">Bands</span></code> dan <code class=\"docutils literal notranslate\"><span class=\"pre\">Artists</span></code> mempunyai hubungan many-to-many.</p>\n</section>","rootId":"database-access-optimization","toc":[{"title":"Profil dahulu","anchor":"profile-first","children":[]},{"title":"Gunakan teknik-teknik optimalisasi DB standar","anchor":"use-standard-db-optimization-techniques","children":[]},{"title":"Memahami QuerySet","anchor":"understand-querysets","children":[{"title":"Memahami penilaian QuerySet","anchor":"understand-queryset-evaluation","children":[]},{"title":"Memahami atribut tembolok","anchor":"understand-cached-attributes","children":[]},{"title":"Gunakan etiket cetakan with","anchor":"use-the-with-template-tag","children":[]},{"title":"Gunakan iterator()","anchor":"use-iterator","children":[]}]},{"title":"Lakukan pekerjaan basisdata di basisdata daripada di Python","anchor":"do-database-work-in-the-database-rather-than-in-python","children":[{"title":"Gunakan RawSQL","anchor":"use-rawsql","children":[]},{"title":"Gunakan SQL mentah","anchor":"use-raw-sql","children":[]}]},{"title":"Mengambil obyek tersendiri menggukan sebuah unik, kolom indeks","anchor":"retrieve-individual-objects-using-a-unique-indexed-column","children":[]},{"title":"Mengambil semuanya sekaligus jika anda mengetahui anda akan membutuhkannya","anchor":"retrieve-everything-at-once-if-you-know-you-will-need-it","children":[{"title":"Gunakan QuerySet.select_related() dan prefetch_related()","anchor":"use-queryset-select-related-and-prefetch-related","children":[]}]},{"title":"Jangan mengambil hal yang tidak anda butuhkan","anchor":"don-t-retrieve-things-you-don-t-need","children":[{"title":"Gunakan QuerySet.values() dan values_list()","anchor":"use-queryset-values-and-values-list","children":[]},{"title":"Gunakan QuerySet.defer() dan only()","anchor":"use-queryset-defer-and-only","children":[]},{"title":"Gunakan QuerySet.count()","anchor":"use-queryset-count","children":[]},{"title":"Gunakan QuerySet.exists()","anchor":"use-queryset-exists","children":[]},{"title":"Jangan berlebihan count() dan exists()","anchor":"don-t-overuse-count-and-exists","children":[]},{"title":"Gunakan QuerySet.update() dan delete()","anchor":"use-queryset-update-and-delete","children":[]},{"title":"Menggunakan nilai foreign key secara langsung","anchor":"use-foreign-key-values-directly","children":[]},{"title":"Jangan urutkan hasil jika anda tidak peduli","anchor":"don-t-order-results-if-you-don-t-care","children":[]}]},{"title":"Masuk dalam bulk","anchor":"insert-in-bulk","children":[]}],"breadcrumbs":[{"docname":"topics/index","title":"Menggunakan Django","url":"/id/1.11/topics/"},{"docname":"topics/db/index","title":"Model dan basisdata","url":"/id/1.11/topics/db/"}],"prev":{"docname":"topics/db/tablespaces","title":"Tablespaces","url":"/id/1.11/topics/db/tablespaces/"},"next":{"docname":"topics/db/examples/index","title":"Contoh-contoh dari hubungan model penggunaan API","url":"/id/1.11/topics/db/examples/"},"formats":{"html":"/id/1.11/topics/db/optimization/","markdown":"/id/1.11/topics/db/optimization.md","json":"/id/1.11/topics/db/optimization.json"},"source":"https://github.com/django/django/blob/stable/1.11.x/docs/topics/db/optimization.txt","official":"https://docs.djangoproject.com/id/1.11/topics/db/optimization/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","fr","ja","id","pt-br","ko","es","el","pl"]}