<!-- CANARY: REQ=REQ-GQL-016; FEATURE="MultiIndexOptimizer"; ASPECT=IndexTypeSelection; STATUS=TESTED; OWNER=engine; UPDATED=2025-10-03 --> <h2 id="indexing-and-query-optimization-tutorial" class="position-relative d-flex align-items-center group"> <span>Indexing and Query Optimization Tutorial</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="indexing-and-query-optimization-tutorial" aria-haspopup="dialog" aria-label="Share link: Indexing and Query Optimization Tutorial"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h2><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden> <div class="hsm-dialog" role="document"> <div class="hsm-header"> <h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2> <button type="button" class="hsm-close" aria-label="Close"> <i class="fa-solid fa-xmark"></i> </button> </div> <div class="hsm-body"> <label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label> <div class="input-group mb-4 hsm-url-group"> <input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" /> <button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy"> <i class="fa-duotone fa-clipboard" aria-hidden="true"></i> </button> </div> <div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div> <div class="hsm-share-grid"> <a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-twitter me-2"></i>Twitter </a> <a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-linkedin me-2"></i>LinkedIn </a> <a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-facebook me-2"></i>Facebook </a> </div> </div> </div> </div> <style> .heading-share-modal { position: fixed; inset: 0; display: flex; justify-content: center; align-items: center; background: rgba(0, 0, 0, 0.6); z-index: 1050; padding: 1rem; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .heading-share-modal[hidden] { display: none !important; } .hsm-dialog { max-width: 420px; width: 100%; background: var(--bs-body-bg, #fff); color: var(--bs-body-color, #212529); border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); border-radius: 1rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; animation: hsm-fade-in 0.2s ease-out; } @keyframes hsm-fade-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } [data-bs-theme="dark"] .hsm-dialog { background: #1e293b; border-color: rgba(255,255,255,0.1); color: #f8f9fa; } .hsm-header { display: flex; justify-content: space-between; align-items: center; padding: 1rem 1.5rem; border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); background: rgba(0,0,0,0.02); } [data-bs-theme="dark"] .hsm-header { background: rgba(255,255,255,0.02); border-color: rgba(255,255,255,0.1); } .hsm-close { background: transparent; border: none; color: inherit; opacity: 0.5; padding: 0.25rem 0.5rem; border-radius: 0.25rem; font-size: 1.2rem; line-height: 1; transition: opacity 0.2s; } .hsm-close:hover { opacity: 1; } .hsm-body { padding: 1.5rem; } .hsm-url-group { display: flex !important; align-items: stretch; } .hsm-url-group .form-control { flex: 1; min-width: 0; margin: 0; background: var(--bs-secondary-bg, #f8f9fa); border-color: var(--bs-border-color, #dee2e6); border-top-right-radius: 0; border-bottom-right-radius: 0; height: 42px; } .hsm-url-group .btn { flex: 0 0 auto; margin: 0; margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0; height: 42px; display: flex; align-items: center; justify-content: center; padding: 0 1.25rem; z-index: 2; } [data-bs-theme="dark"] .hsm-url-group .form-control { background: #0f172a; border-color: #334155; color: #e2e8f0; } .hsm-share-grid { display: flex; flex-direction: column; gap: 0.5rem; } .hsm-share-grid .btn { display: flex; align-items: center; justify-content: center; font-size: 0.9rem; padding: 0.6rem; border-color: var(--bs-border-color); width: 100%; } [data-bs-theme="dark"] .hsm-share-grid .btn { color: #e2e8f0; border-color: #475569; } [data-bs-theme="dark"] .hsm-share-grid .btn:hover { background: #334155; border-color: #cbd5e1; } </style> <script> (function(){ const modal = document.getElementById('headingShareModal'); if(!modal) return; const input = modal.querySelector('#headingShareInput'); const copyBtn = modal.querySelector('.hsm-copy'); const twitter = modal.querySelector('#share-twitter'); const linkedin = modal.querySelector('#share-linkedin'); const facebook = modal.querySelector('#share-facebook'); const closeBtn = modal.querySelector('.hsm-close'); let lastFocus=null; let trapBound=false; function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; } function isOpen(){ return !modal.hasAttribute('hidden'); } function hydrate(id){ const url=buildUrl(id); input.value=url; const enc=encodeURIComponent(url); const text=encodeURIComponent(document.title); if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`; if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`; if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`; } function openModal(id){ lastFocus=document.activeElement; hydrate(id); if(!isOpen()){ modal.removeAttribute('hidden'); } requestAnimationFrame(()=>{ input.focus(); }); trapFocus(); } function closeModal(){ if(!isOpen()) return; modal.setAttribute('hidden',''); if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus(); } function copyCurrent(){ try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); } catch(e){ fallback(); } } function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} } function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); } function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); } function bindShareButtons(){ document.querySelectorAll('.h-share').forEach(btn=>{ if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; } }); } bindShareButtons(); if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', bindShareButtons); } else { requestAnimationFrame(bindShareButtons); } document.addEventListener('click', function(e){ const shareBtn=e.target.closest && e.target.closest('.h-share'); if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); } }, true); document.addEventListener('click', e=>{ if(e.target===modal) closeModal(); if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); } if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); } }); document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); }); function trapFocus(){ if(trapBound) return; trapBound=true; modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } }); } if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); }); })(); </script><p>Learn to create indexes and optimize query performance using EXPLAIN and PROFILE in this hands-on 15-minute tutorial.</p> <h3 id="prerequisites" class="position-relative d-flex align-items-center group"> <span>Prerequisites</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="prerequisites" aria-haspopup="dialog" aria-label="Share link: Prerequisites"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li>Completed <a href="/docs/tutorials/match-basics/" >MATCH Basics Tutorial</a> </li> <li>Geode server running (<code>geode serve</code>)</li> <li>Access to Geode shell (<code>geode shell</code>)</li> </ul> <h3 id="tutorial-overview" class="position-relative d-flex align-items-center group"> <span>Tutorial Overview</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="tutorial-overview" aria-haspopup="dialog" aria-label="Share link: Tutorial Overview"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Time</strong>: 15 minutes <strong>Difficulty</strong>: Intermediate <strong>Topics</strong>: Index creation, query plans, performance profiling, optimization strategies</p> <p>By the end of this tutorial, you&rsquo;ll be able to:</p> <ul> <li>Identify slow queries using PROFILE</li> <li>Create appropriate indexes for query patterns</li> <li>Use EXPLAIN to verify index usage</li> <li>Compare query performance before and after indexing</li> <li>Understand cost-based optimizer behavior</li> </ul> <h3 id="step-1-create-sample-dataset" class="position-relative d-flex align-items-center group"> <span>Step 1: Create Sample Dataset</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-1-create-sample-dataset" aria-haspopup="dialog" aria-label="Share link: Step 1: Create Sample Dataset"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Create a larger dataset to demonstrate performance differences:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="py">PerformanceTest</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USE</span><span class="w"> </span><span class="py">PerformanceTest</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">100</span><span class="w"> </span><span class="py">person</span><span class="w"> </span><span class="py">nodes</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Person_1&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">age</span><span class="p">:</span><span class="w"> </span><span class="nc">25</span><span class="p">,</span><span class="w"> </span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Seattle&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">salary</span><span class="p">:</span><span class="w"> </span><span class="nc">50000</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Person_2&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">age</span><span class="p">:</span><span class="w"> </span><span class="nc">30</span><span class="p">,</span><span class="w"> </span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Portland&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">salary</span><span class="p">:</span><span class="w"> </span><span class="nc">60000</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Person_3&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">age</span><span class="p">:</span><span class="w"> </span><span class="nc">35</span><span class="p">,</span><span class="w"> </span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Seattle&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">salary</span><span class="p">:</span><span class="w"> </span><span class="nc">70000</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Person_4&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">age</span><span class="p">:</span><span class="w"> </span><span class="nc">28</span><span class="p">,</span><span class="w"> </span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;San Francisco&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">salary</span><span class="p">:</span><span class="w"> </span><span class="nc">90000</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Person_5&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">age</span><span class="p">:</span><span class="w"> </span><span class="nc">42</span><span class="p">,</span><span class="w"> </span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Seattle&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">salary</span><span class="p">:</span><span class="w"> </span><span class="nc">85000</span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">In</span><span class="w"> </span><span class="py">production</span><span class="p">,</span><span class="w"> </span><span class="py">you</span><span class="err">&#39;</span><span class="py">d</span><span class="w"> </span><span class="py">create</span><span class="w"> </span><span class="py">many</span><span class="w"> </span><span class="py">more</span><span class="w"> </span><span class="py">nodes</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">For</span><span class="w"> </span><span class="py">this</span><span class="w"> </span><span class="py">tutorial</span><span class="p">,</span><span class="w"> </span><span class="py">5</span><span class="w"> </span><span class="py">nodes</span><span class="w"> </span><span class="py">demonstrate</span><span class="w"> </span><span class="py">the</span><span class="w"> </span><span class="py">concepts</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Created 5 nodes </span></span></code></pre></div> <h4 id="what-you-learned" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li>Indexing becomes critical with large datasets (1000+ nodes)</li> <li>Small datasets may not show dramatic improvements</li> <li>Real benefits appear at scale (millions of nodes/relationships)</li> </ul> <h3 id="step-2-identify-slow-query-with-profile" class="position-relative d-flex align-items-center group"> <span>Step 2: Identify Slow Query with PROFILE</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-2-identify-slow-query-with-profile" aria-haspopup="dialog" aria-label="Share link: Step 2: Identify Slow Query with PROFILE"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Run a query with performance profiling:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">30</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">salary</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">salary</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">name | age | salary </span></span><span class="line"><span class="cl">----------|-----|-------- </span></span><span class="line"><span class="cl">Person_4 | 28 | 90000 </span></span><span class="line"><span class="cl">Person_5 | 42 | 85000 </span></span><span class="line"><span class="cl">Person_3 | 35 | 70000 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">PROFILE: </span></span><span class="line"><span class="cl"> Operation: SeqScan [Person] </span></span><span class="line"><span class="cl"> Rows scanned: 5 </span></span><span class="line"><span class="cl"> Rows returned: 3 </span></span><span class="line"><span class="cl"> Execution time: 0.234ms </span></span><span class="line"><span class="cl"> Filter: age &gt; 30 </span></span></code></pre></div> <h4 id="understanding-profile-output" class="position-relative d-flex align-items-center group"> <span>Understanding PROFILE Output</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="understanding-profile-output" aria-haspopup="dialog" aria-label="Share link: Understanding PROFILE Output"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><strong>SeqScan</strong>: Sequential scan (reads every node)</li> <li><strong>Rows scanned</strong>: Total nodes examined</li> <li><strong>Rows returned</strong>: Nodes matching criteria</li> <li><strong>Execution time</strong>: Query duration</li> <li><strong>Filter</strong>: Condition applied during scan</li> </ul> <h4 id="problem-identified" class="position-relative d-flex align-items-center group"> <span>Problem Identified</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="problem-identified" aria-haspopup="dialog" aria-label="Share link: Problem Identified"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><strong>SeqScan</strong> scans ALL nodes, even those not matching</li> <li>Inefficient for large datasets (scans millions to find thousands)</li> <li>Execution time grows linearly with data size</li> </ul> <h4 id="what-you-learned-1" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-1" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><code>PROFILE</code> shows query execution details</li> <li>SeqScan indicates no index usage</li> <li>Performance degrades with dataset size</li> <li>Need indexes for efficient filtering</li> </ul> <h3 id="step-3-create-b-tree-index" class="position-relative d-flex align-items-center group"> <span>Step 3: Create B-tree Index</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-3-create-b-tree-index" aria-haspopup="dialog" aria-label="Share link: Step 3: Create B-tree Index"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Create an index on the <code>age</code> property:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">person_age_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="p">(</span><span class="py">age</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Index &#39;person_age_idx&#39; created successfully </span></span><span class="line"><span class="cl">Indexed 5 nodes </span></span><span class="line"><span class="cl">Build time: 0.12ms </span></span></code></pre></div> <h4 id="b-tree-index-characteristics" class="position-relative d-flex align-items-center group"> <span>B-tree Index Characteristics</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="b-tree-index-characteristics" aria-haspopup="dialog" aria-label="Share link: B-tree Index Characteristics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><strong>Best for</strong>: Range queries (<code>&gt;</code>, <code>&lt;</code>, <code>&gt;=</code>, <code>&lt;=</code>, <code>BETWEEN</code>)</li> <li><strong>Supported operations</strong>: Equality (<code>=</code>), ordering (<code>ORDER BY</code>)</li> <li><strong>Structure</strong>: Balanced tree for O(log n) lookups</li> <li><strong>Space overhead</strong>: ~5-10% of data size</li> </ul> <h4 id="index-naming-convention" class="position-relative d-flex align-items-center group"> <span>Index Naming Convention</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="index-naming-convention" aria-haspopup="dialog" aria-label="Share link: Index Naming Convention"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&lt;label&gt;_&lt;property&gt;_idx </span></span></code></pre></div><p>Examples:</p> <ul> <li><code>person_age_idx</code></li> <li><code>product_price_idx</code></li> <li><code>user_email_idx</code></li> </ul> <h4 id="what-you-learned-2" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-2" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><code>CREATE INDEX</code> builds an index structure</li> <li><code>USING btree</code> specifies index type</li> <li>Indexes are built immediately (synchronous)</li> <li>B-tree optimal for numeric ranges</li> </ul> <h3 id="step-4-verify-index-usage-with-explain" class="position-relative d-flex align-items-center group"> <span>Step 4: Verify Index Usage with EXPLAIN</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-4-verify-index-usage-with-explain" aria-haspopup="dialog" aria-label="Share link: Step 4: Verify Index Usage with EXPLAIN"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Check if the optimizer uses your index:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">EXPLAIN</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">30</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">salary</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">salary</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">QUERY PLAN: </span></span><span class="line"><span class="cl">┌─ Project [p.name, p.age, p.salary] </span></span><span class="line"><span class="cl">└─ Sort [p.salary DESC] </span></span><span class="line"><span class="cl"> └─ Filter [p.age &gt; 30] </span></span><span class="line"><span class="cl"> └─ IndexScan [person_age_idx] </span></span><span class="line"><span class="cl"> Index: person_age_idx (btree) </span></span><span class="line"><span class="cl"> Condition: age &gt; 30 </span></span><span class="line"><span class="cl"> Estimated rows: 3 </span></span><span class="line"><span class="cl"> Estimated cost: 2.5 </span></span></code></pre></div> <h4 id="understanding-explain-output" class="position-relative d-flex align-items-center group"> <span>Understanding EXPLAIN Output</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="understanding-explain-output" aria-haspopup="dialog" aria-label="Share link: Understanding EXPLAIN Output"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><strong>Project</strong>: Select specific columns</li> <li><strong>Sort</strong>: ORDER BY implementation</li> <li><strong>Filter</strong>: WHERE clause evaluation</li> <li><strong>IndexScan</strong>: Uses index (not SeqScan!)</li> <li><strong>Estimated rows</strong>: Optimizer&rsquo;s row count prediction</li> <li><strong>Estimated cost</strong>: Relative expense (lower = better)</li> </ul> <h4 id="verify-index-used" class="position-relative d-flex align-items-center group"> <span>Verify Index Used</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="verify-index-used" aria-haspopup="dialog" aria-label="Share link: Verify Index Used"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Look for:</p> <ul> <li><code>IndexScan</code> instead of <code>SeqScan</code></li> <li>Index name (<code>person_age_idx</code>)</li> <li>Condition pushed down to index</li> </ul> <h4 id="what-you-learned-3" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-3" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><code>EXPLAIN</code> shows query plan without executing</li> <li>IndexScan confirms index usage</li> <li>Optimizer estimates rows and costs</li> <li>Index dramatically reduces work</li> </ul> <h3 id="step-5-compare-performance" class="position-relative d-flex align-items-center group"> <span>Step 5: Compare Performance</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-5-compare-performance" aria-haspopup="dialog" aria-label="Share link: Step 5: Compare Performance"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Run PROFILE again with index:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">30</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">salary</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">salary</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">name | age | salary </span></span><span class="line"><span class="cl">----------|-----|-------- </span></span><span class="line"><span class="cl">Person_4 | 28 | 90000 </span></span><span class="line"><span class="cl">Person_5 | 42 | 85000 </span></span><span class="line"><span class="cl">Person_3 | 35 | 70000 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">PROFILE: </span></span><span class="line"><span class="cl"> Operation: IndexScan [person_age_idx] </span></span><span class="line"><span class="cl"> Index: person_age_idx (btree) </span></span><span class="line"><span class="cl"> Rows scanned: 3 </span></span><span class="line"><span class="cl"> Rows returned: 3 </span></span><span class="line"><span class="cl"> Execution time: 0.08ms </span></span><span class="line"><span class="cl"> Filter: age &gt; 30 (index) </span></span></code></pre></div> <h4 id="performance-improvements" class="position-relative d-flex align-items-center group"> <span>Performance Improvements</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="performance-improvements" aria-haspopup="dialog" aria-label="Share link: Performance Improvements"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Before Index</strong>:</p> <ul> <li>Operation: SeqScan</li> <li>Rows scanned: 5</li> <li>Execution time: 0.234ms</li> </ul> <p><strong>After Index</strong>:</p> <ul> <li>Operation: IndexScan</li> <li>Rows scanned: 3 (only matching rows!)</li> <li>Execution time: 0.08ms</li> </ul> <p><strong>Speedup</strong>: ~3x faster (more dramatic with larger datasets)</p> <h4 id="what-you-learned-4" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-4" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li>Index reduced rows scanned (5 → 3)</li> <li>Execution time improved by ~66%</li> <li>Improvement scales with dataset size</li> <li>Index pays off for repeated queries</li> </ul> <h3 id="step-6-composite-index" class="position-relative d-flex align-items-center group"> <span>Step 6: Composite Index</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-6-composite-index" aria-haspopup="dialog" aria-label="Share link: Step 6: Composite Index"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Create multi-column index for complex queries:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">person_city_age_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="p">(</span><span class="py">city</span><span class="p">,</span><span class="w"> </span><span class="py">age</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Index &#39;person_city_age_idx&#39; created successfully </span></span><span class="line"><span class="cl">Indexed 5 nodes </span></span><span class="line"><span class="cl">Build time: 0.15ms </span></span></code></pre></div> <h4 id="when-to-use-composite-indexes" class="position-relative d-flex align-items-center group"> <span>When to Use Composite Indexes</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="when-to-use-composite-indexes" aria-haspopup="dialog" aria-label="Share link: When to Use Composite Indexes"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Good for</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Uses</span><span class="w"> </span><span class="py">city_age</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">efficiently</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">Seattle</span><span class="err">&#39;</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">age</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">30</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">Seattle</span><span class="err">&#39;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Uses</span><span class="w"> </span><span class="py">first</span><span class="w"> </span><span class="py">column</span><span class="w"> </span><span class="kd">on</span><span class="py">ly</span><span class="w"> </span></span></span></code></pre></div><p><strong>Not optimal</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Cannot</span><span class="w"> </span><span class="py">use</span><span class="w"> </span><span class="py">city_age</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="p">(</span><span class="py">skips</span><span class="w"> </span><span class="py">first</span><span class="w"> </span><span class="py">column</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">age</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">30</span><span class="w"> </span></span></span></code></pre></div> <h4 id="index-column-order" class="position-relative d-flex align-items-center group"> <span>Index Column Order</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="index-column-order" aria-haspopup="dialog" aria-label="Share link: Index Column Order"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Rule</strong>: Most selective column first, then range column</p> <p><strong>Example</strong>:</p> <ul> <li><code>city</code> has few distinct values (low selectivity)</li> <li><code>age</code> has many distinct values (high selectivity)</li> <li>For equality + range: put equality first</li> </ul> <p>Optimal order: <code>(city, age)</code> for <code>WHERE city = X AND age &gt; Y</code></p> <h4 id="what-you-learned-5" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-5" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li>Composite indexes span multiple properties</li> <li>Column order matters for query matching</li> <li>Leftmost prefix rule applies</li> <li>Trade-off: storage vs query performance</li> </ul> <h3 id="step-7-index-types-comparison" class="position-relative d-flex align-items-center group"> <span>Step 7: Index Types Comparison</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-7-index-types-comparison" aria-haspopup="dialog" aria-label="Share link: Step 7: Index Types Comparison"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Create indexes for different use cases:</p> <h4 id="b-tree-index-range-queries" class="position-relative d-flex align-items-center group"> <span>B-tree Index (Range Queries)</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="b-tree-index-range-queries" aria-haspopup="dialog" aria-label="Share link: B-tree Index (Range Queries)"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">product_price_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Product</span><span class="p">(</span><span class="py">price</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Optimal</span><span class="w"> </span><span class="py">for</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="py">price</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">100</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">price</span><span class="w"> </span><span class="py">BETWEEN</span><span class="w"> </span><span class="py">50</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">200</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">price</span><span class="w"> </span></span></span></code></pre></div> <h4 id="hash-index-equality-only" class="position-relative d-flex align-items-center group"> <span>Hash Index (Equality Only)</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="hash-index-equality-only" aria-haspopup="dialog" aria-label="Share link: Hash Index (Equality Only)"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_email_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">User</span><span class="p">(</span><span class="py">email</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">hash</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Optimal</span><span class="w"> </span><span class="py">for</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="py">email</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">user</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">optimal</span><span class="w"> </span><span class="py">for</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="py">email</span><span class="w"> </span><span class="py">LIKE</span><span class="w"> </span><span class="err">&#39;%</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">&#39;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Use</span><span class="w"> </span><span class="py">btree</span><span class="w"> </span><span class="py">instead</span><span class="w"> </span></span></span></code></pre></div> <h4 id="full-text-index-text-search" class="position-relative d-flex align-items-center group"> <span>Full-Text Index (Text Search)</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="full-text-index-text-search" aria-haspopup="dialog" aria-label="Share link: Full-Text Index (Text Search)"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">doc_content_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Document</span><span class="p">(</span><span class="py">content</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">fulltext</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Optimal</span><span class="w"> </span><span class="py">for</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="py">fulltext_match</span><span class="p">(</span><span class="py">content</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;graph database&#34;</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h4 id="vector-index-similarity-search" class="position-relative d-flex align-items-center group"> <span>Vector Index (Similarity Search)</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="vector-index-similarity-search" aria-haspopup="dialog" aria-label="Share link: Vector Index (Similarity Search)"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">product_emb_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Product</span><span class="p">(</span><span class="py">embedding</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">vector</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Optimal</span><span class="w"> </span><span class="py">for</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="py">vector_distance_cosine</span><span class="p">(</span><span class="py">embedding</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_vec</span><span class="p">)</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">0</span><span class="mf">.5</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">vector_distance_cosine</span><span class="p">(</span><span class="py">embedding</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_vec</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="w"> </span></span></span></code></pre></div> <h4 id="bloom-filter-index-membership-testing" class="position-relative d-flex align-items-center group"> <span>Bloom Filter Index (Membership Testing)</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="bloom-filter-index-membership-testing" aria-haspopup="dialog" aria-label="Share link: Bloom Filter Index (Membership Testing)"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">tags_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Article</span><span class="p">(</span><span class="py">tags</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">bloom</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Optimal</span><span class="w"> </span><span class="py">for</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="err">&#39;</span><span class="py">database</span><span class="err">&#39;</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">tags</span><span class="w"> </span></span></span></code></pre></div> <h4 id="index-type-summary" class="position-relative d-flex align-items-center group"> <span>Index Type Summary</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="index-type-summary" aria-haspopup="dialog" aria-label="Share link: Index Type Summary"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><table> <thead> <tr> <th>Index Type</th> <th>Best For</th> <th>Operations</th> <th>Space</th> <th>Build Time</th> </tr> </thead> <tbody> <tr> <td>B-tree</td> <td>Ranges, ordering</td> <td><code>&gt;</code>, <code>&lt;</code>, <code>=</code>, <code>ORDER BY</code></td> <td>Low</td> <td>Fast</td> </tr> <tr> <td>Hash</td> <td>Exact matches</td> <td><code>=</code></td> <td>Very Low</td> <td>Very Fast</td> </tr> <tr> <td>Full-text</td> <td>Text search</td> <td><code>fulltext_match()</code></td> <td>Medium</td> <td>Medium</td> </tr> <tr> <td>Vector</td> <td>Similarity</td> <td><code>vector_distance_*()</code></td> <td>High</td> <td>Slow</td> </tr> <tr> <td>Bloom</td> <td>Membership</td> <td><code>IN</code>, <code>ANY</code></td> <td>Very Low</td> <td>Very Fast</td> </tr> </tbody> </table> <h4 id="what-you-learned-6" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-6" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li>Different index types for different query patterns</li> <li>B-tree is general-purpose (most common)</li> <li>Specialized indexes for specific operations</li> <li>Trade-offs between space, build time, and query speed</li> </ul> <h3 id="step-8-cost-based-optimizer" class="position-relative d-flex align-items-center group"> <span>Step 8: Cost-Based Optimizer</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-8-cost-based-optimizer" aria-haspopup="dialog" aria-label="Share link: Step 8: Cost-Based Optimizer"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Observe optimizer choosing between indexes:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">overlapping</span><span class="w"> </span><span class="py">indexes</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">person_age_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="p">(</span><span class="py">age</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">person_age_city_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="p">(</span><span class="py">age</span><span class="p">,</span><span class="w"> </span><span class="py">city</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Optimizer</span><span class="w"> </span><span class="py">chooses</span><span class="w"> </span><span class="py">best</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">EXPLAIN</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">30</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">Seattle</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">QUERY PLAN: </span></span><span class="line"><span class="cl">└─ IndexScan [person_age_city_idx] </span></span><span class="line"><span class="cl"> Index: person_age_city_idx (btree, composite) </span></span><span class="line"><span class="cl"> Condition: age &gt; 30 AND city = &#39;Seattle&#39; </span></span><span class="line"><span class="cl"> Estimated rows: 2 </span></span><span class="line"><span class="cl"> Estimated cost: 1.8 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">OPTIMIZER DECISION: </span></span><span class="line"><span class="cl"> Considered indexes: </span></span><span class="line"><span class="cl"> - person_age_idx: cost 3.2 (single column) </span></span><span class="line"><span class="cl"> - person_age_city_idx: cost 1.8 (both columns match) ✓ CHOSEN </span></span><span class="line"><span class="cl"> Reason: Composite index covers both predicates </span></span></code></pre></div> <h4 id="optimizer-selection-criteria" class="position-relative d-flex align-items-center group"> <span>Optimizer Selection Criteria</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="optimizer-selection-criteria" aria-haspopup="dialog" aria-label="Share link: Optimizer Selection Criteria"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ol> <li><strong>Index coverage</strong>: More matched columns = better</li> <li><strong>Selectivity</strong>: Fewer estimated rows = better</li> <li><strong>Index type</strong>: Appropriate for operation</li> <li><strong>Cost estimate</strong>: Logarithmic scaling for trees</li> </ol> <h4 id="what-you-learned-7" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-7" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li>Optimizer automatically chooses best index</li> <li>Multiple indexes don&rsquo;t hurt (optimizer picks one)</li> <li>Composite indexes preferred when applicable</li> <li>Cost model guides selection</li> </ul> <h3 id="step-9-index-statistics" class="position-relative d-flex align-items-center group"> <span>Step 9: Index Statistics</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-9-index-statistics" aria-haspopup="dialog" aria-label="Share link: Step 9: Index Statistics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Update statistics for accurate cost estimation:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Analyze</span><span class="w"> </span><span class="py">table</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">collect</span><span class="w"> </span><span class="py">statistics</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ANALYZE</span><span class="w"> </span><span class="py">Person</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Statistics updated for label &#39;Person&#39; </span></span><span class="line"><span class="cl"> Rows: 5 </span></span><span class="line"><span class="cl"> Distinct values (age): 5 </span></span><span class="line"><span class="cl"> Distinct values (city): 3 </span></span><span class="line"><span class="cl"> Min age: 25, Max age: 42 </span></span><span class="line"><span class="cl"> Null fraction (age): 0.0 </span></span></code></pre></div> <h4 id="statistics-purpose" class="position-relative d-flex align-items-center group"> <span>Statistics Purpose</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="statistics-purpose" aria-haspopup="dialog" aria-label="Share link: Statistics Purpose"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><strong>Cardinality</strong>: Row counts per label</li> <li><strong>Distinct values</strong>: Property selectivity</li> <li><strong>Value distribution</strong>: Histograms for ranges</li> <li><strong>Null fraction</strong>: Percentage of nulls</li> </ul> <h4 id="when-to-analyze" class="position-relative d-flex align-items-center group"> <span>When to ANALYZE</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="when-to-analyze" aria-haspopup="dialog" aria-label="Share link: When to ANALYZE"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li>After bulk data loads</li> <li>After significant updates (&gt;10% of data)</li> <li>Before major query optimization work</li> <li>Periodically (daily/weekly for active databases)</li> </ul> <h4 id="auto-update-configuration" class="position-relative d-flex align-items-center group"> <span>Auto-Update Configuration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="auto-update-configuration" aria-haspopup="dialog" aria-label="Share link: Auto-Update Configuration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># geode.yaml</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">optimizer</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">statistics</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">auto_update</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">update_interval</span><span class="p">:</span><span class="w"> </span><span class="s1">&#39;1h&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sample_size</span><span class="p">:</span><span class="w"> </span><span class="m">10000</span><span class="w"> </span></span></span></code></pre></div> <h4 id="what-you-learned-8" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-8" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li>Statistics improve optimizer accuracy</li> <li><code>ANALYZE</code> updates statistics</li> <li>Stale statistics lead to poor plans</li> <li>Auto-update recommended for production</li> </ul> <h3 id="step-10-index-maintenance" class="position-relative d-flex align-items-center group"> <span>Step 10: Index Maintenance</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="step-10-index-maintenance" aria-haspopup="dialog" aria-label="Share link: Step 10: Index Maintenance"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Monitor and maintain indexes:</p> <h4 id="list-all-indexes" class="position-relative d-flex align-items-center group"> <span>List All Indexes</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="list-all-indexes" aria-haspopup="dialog" aria-label="Share link: List All Indexes"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">SHOW</span><span class="w"> </span><span class="py">INDEXES</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">name | label | properties | type | unique | status </span></span><span class="line"><span class="cl">----------------------|--------|--------------|--------|--------|-------- </span></span><span class="line"><span class="cl">person_age_idx | Person | [age] | btree | false | ready </span></span><span class="line"><span class="cl">person_city_age_idx | Person | [city, age] | btree | false | ready </span></span><span class="line"><span class="cl">person_email_idx | Person | [email] | hash | true | ready </span></span></code></pre></div> <h4 id="drop-unused-index" class="position-relative d-flex align-items-center group"> <span>Drop Unused Index</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="drop-unused-index" aria-haspopup="dialog" aria-label="Share link: Drop Unused Index"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">DROP</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">person_age_idx</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected output</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Index &#39;person_age_idx&#39; dropped successfully </span></span></code></pre></div> <h4 id="rebuild-index" class="position-relative d-flex align-items-center group"> <span>Rebuild Index</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="rebuild-index" aria-haspopup="dialog" aria-label="Share link: Rebuild Index"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Drop</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">recreate</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">DROP</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">person_age_idx</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">person_age_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="p">(</span><span class="py">age</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Or</span><span class="w"> </span><span class="py">use</span><span class="w"> </span><span class="py">REINDEX</span><span class="w"> </span><span class="p">(</span><span class="py">if</span><span class="w"> </span><span class="py">supported</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">REINDEX</span><span class="w"> </span><span class="py">person_age_idx</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="index-health-check" class="position-relative d-flex align-items-center group"> <span>Index Health Check</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="index-health-check" aria-haspopup="dialog" aria-label="Share link: Index Health Check"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Check</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="kd">fragment</span><span class="nc">ation</span><span class="w"> </span><span class="p">(</span><span class="py">future</span><span class="w"> </span><span class="py">feature</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">STATS</span><span class="w"> </span><span class="py">person_age_idx</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="what-you-learned-9" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-9" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><code>SHOW INDEXES</code> lists all indexes</li> <li>Drop unused indexes to save space</li> <li>Rebuild for fragmentation or corruption</li> <li>Monitor index health regularly</li> </ul> <h3 id="complete-example-e-commerce-optimization" class="position-relative d-flex align-items-center group"> <span>Complete Example: E-Commerce Optimization</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="complete-example-e-commerce-optimization" aria-haspopup="dialog" aria-label="Share link: Complete Example: E-Commerce Optimization"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Optimize a product catalog query:</p> <h4 id="initial-setup" class="position-relative d-flex align-items-center group"> <span>Initial Setup</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="initial-setup" aria-haspopup="dialog" aria-label="Share link: Initial Setup"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="py">ECommerce</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USE</span><span class="w"> </span><span class="py">ECommerce</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Laptop&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">category</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Electronics&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">price</span><span class="p">:</span><span class="w"> </span><span class="nc">1200</span><span class="p">,</span><span class="w"> </span><span class="py">rating</span><span class="p">:</span><span class="w"> </span><span class="nc">4</span><span class="mf">.5</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Mouse&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">category</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Electronics&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">price</span><span class="p">:</span><span class="w"> </span><span class="nc">25</span><span class="p">,</span><span class="w"> </span><span class="py">rating</span><span class="p">:</span><span class="w"> </span><span class="nc">4</span><span class="mf">.2</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">3</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Desk&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">category</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Furniture&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">price</span><span class="p">:</span><span class="w"> </span><span class="nc">350</span><span class="p">,</span><span class="w"> </span><span class="py">rating</span><span class="p">:</span><span class="w"> </span><span class="nc">4</span><span class="mf">.7</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">4</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Chair&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">category</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Furniture&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">price</span><span class="p">:</span><span class="w"> </span><span class="nc">200</span><span class="p">,</span><span class="w"> </span><span class="py">rating</span><span class="p">:</span><span class="w"> </span><span class="nc">4</span><span class="mf">.6</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">5</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Monitor&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">category</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Electronics&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">price</span><span class="p">:</span><span class="w"> </span><span class="nc">400</span><span class="p">,</span><span class="w"> </span><span class="py">rating</span><span class="p">:</span><span class="w"> </span><span class="nc">4</span><span class="mf">.4</span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="slow-query" class="position-relative d-flex align-items-center group"> <span>Slow Query</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="slow-query" aria-haspopup="dialog" aria-label="Share link: Slow Query"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">category</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">Electronics</span><span class="err">&#39;</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">500</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">4</span><span class="mf">.0</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Result</strong>: SeqScan, 5 rows scanned</p> <h4 id="create-optimal-indexes" class="position-relative d-flex align-items-center group"> <span>Create Optimal Indexes</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="create-optimal-indexes" aria-haspopup="dialog" aria-label="Share link: Create Optimal Indexes"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Composite</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">category</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">price</span><span class="w"> </span><span class="py">range</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">prod_cat_price_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Product</span><span class="p">(</span><span class="py">category</span><span class="p">,</span><span class="w"> </span><span class="py">price</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Separate</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">rating</span><span class="w"> </span><span class="p">(</span><span class="py">used</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">prod_rating_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Product</span><span class="p">(</span><span class="py">rating</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Update</span><span class="w"> </span><span class="py">statistics</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ANALYZE</span><span class="w"> </span><span class="py">Product</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="verify-optimization" class="position-relative d-flex align-items-center group"> <span>Verify Optimization</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="verify-optimization" aria-haspopup="dialog" aria-label="Share link: Verify Optimization"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">EXPLAIN</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">category</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">Electronics</span><span class="err">&#39;</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">500</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">4</span><span class="mf">.0</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expected plan</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">└─ Project [p.name, p.price, p.rating] </span></span><span class="line"><span class="cl"> └─ Sort [p.rating DESC] using prod_rating_idx </span></span><span class="line"><span class="cl"> └─ Filter [p.rating &gt; 4.0] </span></span><span class="line"><span class="cl"> └─ IndexScan [prod_cat_price_idx] </span></span><span class="line"><span class="cl"> Condition: category = &#39;Electronics&#39; AND price &lt; 500 </span></span><span class="line"><span class="cl"> Estimated rows: 2 </span></span></code></pre></div> <h4 id="performance-comparison" class="position-relative d-flex align-items-center group"> <span>Performance Comparison</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="performance-comparison" aria-haspopup="dialog" aria-label="Share link: Performance Comparison"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">category</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">Electronics</span><span class="err">&#39;</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">500</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">4</span><span class="mf">.0</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">rating</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Before</strong>: 5 rows scanned, 0.25ms <strong>After</strong>: 2 rows scanned, 0.08ms <strong>Improvement</strong>: 68% faster, 60% fewer rows</p> <h4 id="what-you-learned-10" class="position-relative d-flex align-items-center group"> <span>What You Learned</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="what-you-learned-10" aria-haspopup="dialog" aria-label="Share link: What You Learned"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li>Combine indexes for complex queries</li> <li>Separate indexes for filter vs sort</li> <li>Composite indexes reduce scan size</li> <li>ORDER BY can use indexes too</li> </ul> <h3 id="best-practices" class="position-relative d-flex align-items-center group"> <span>Best Practices</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="best-practices" aria-haspopup="dialog" aria-label="Share link: Best Practices"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="index-creation-strategy" class="position-relative d-flex align-items-center group"> <span>Index Creation Strategy</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="index-creation-strategy" aria-haspopup="dialog" aria-label="Share link: Index Creation Strategy"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ol> <li><strong>Profile first</strong>: Use PROFILE to find slow queries</li> <li><strong>Identify patterns</strong>: Look for common WHERE/ORDER BY columns</li> <li><strong>Create selectively</strong>: Don&rsquo;t over-index (balance read vs write performance)</li> <li><strong>Test impact</strong>: Compare EXPLAIN before and after</li> <li><strong>Monitor usage</strong>: Drop unused indexes</li> </ol> <h4 id="index-selection-guidelines" class="position-relative d-flex align-items-center group"> <span>Index Selection Guidelines</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="index-selection-guidelines" aria-haspopup="dialog" aria-label="Share link: Index Selection Guidelines"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Always index</strong>:</p> <ul> <li>Primary keys and unique constraints</li> <li>Foreign key columns (join conditions)</li> <li>Columns in frequent WHERE clauses</li> <li>ORDER BY and GROUP BY columns</li> </ul> <p><strong>Consider indexing</strong>:</p> <ul> <li>Columns with high cardinality (many distinct values)</li> <li>Columns in complex queries</li> <li>Frequently accessed properties</li> </ul> <p><strong>Don&rsquo;t index</strong>:</p> <ul> <li>Low cardinality columns (few distinct values, like boolean)</li> <li>Rarely queried properties</li> <li>Columns updated frequently (write overhead)</li> </ul> <h4 id="performance-rules-of-thumb" class="position-relative d-flex align-items-center group"> <span>Performance Rules of Thumb</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="performance-rules-of-thumb" aria-haspopup="dialog" aria-label="Share link: Performance Rules of Thumb"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><ul> <li><strong>Indexes speed up reads</strong>: Significant improvement for large datasets</li> <li><strong>Indexes add write overhead</strong>: Consider trade-offs when creating indexes</li> <li><strong>Composite indexes</strong>: 2-3 columns maximum recommended</li> <li><strong>Index space</strong>: Varies based on data and index type</li> <li><strong>Statistics</strong>: Update after significant data changes</li> </ul> <h3 id="practice-exercises" class="position-relative d-flex align-items-center group"> <span>Practice Exercises</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="practice-exercises" aria-haspopup="dialog" aria-label="Share link: Practice Exercises"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="exercise-1-optimize-range-query" class="position-relative d-flex align-items-center group"> <span>Exercise 1: Optimize Range Query</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="exercise-1-optimize-range-query" aria-haspopup="dialog" aria-label="Share link: Exercise 1: Optimize Range Query"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">test</span><span class="w"> </span><span class="py">data</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">GRAPH</span><span class="w"> </span><span class="py">RangeTest</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USE</span><span class="w"> </span><span class="py">RangeTest</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Event</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Event_1&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">1609459200</span><span class="p">,</span><span class="w"> </span><span class="py">priority</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Event</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Event_2&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">1609545600</span><span class="p">,</span><span class="w"> </span><span class="py">priority</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Event</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Event_3&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">1609632000</span><span class="p">,</span><span class="w"> </span><span class="py">priority</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">}),</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(:</span><span class="nc">Event</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;Event_4&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">1609718400</span><span class="p">,</span><span class="w"> </span><span class="py">priority</span><span class="p">:</span><span class="w"> </span><span class="nc">3</span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Slow</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">e</span><span class="p">:</span><span class="nc">Event</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">1609500000</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">1609700000</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">timestamp</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Task</strong>: Create an index to optimize this query. Verify with EXPLAIN.</p> <h4 id="exercise-2-composite-index-design" class="position-relative d-flex align-items-center group"> <span>Exercise 2: Composite Index Design</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="exercise-2-composite-index-design" aria-haspopup="dialog" aria-label="Share link: Exercise 2: Composite Index Design"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">pattern</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">country</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">USA</span><span class="err">&#39;</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">25</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">active</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">email</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Task</strong>: Design optimal composite index. Consider column order.</p> <h4 id="exercise-3-index-type-selection" class="position-relative d-flex align-items-center group"> <span>Exercise 3: Index Type Selection</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="exercise-3-index-type-selection" aria-haspopup="dialog" aria-label="Share link: Exercise 3: Index Type Selection"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>For each query, choose the best index type:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">A</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">email</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">alice</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">B</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">product</span><span class="err">.</span><span class="py">price</span><span class="w"> </span><span class="py">BETWEEN</span><span class="w"> </span><span class="py">50</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">100</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">C</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">fulltext_match</span><span class="p">(</span><span class="py">article</span><span class="err">.</span><span class="py">content</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;graph database&#34;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">D</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">vector_distance_l2</span><span class="p">(</span><span class="py">image</span><span class="err">.</span><span class="py">embedding</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_vec</span><span class="p">)</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">0</span><span class="mf">.3</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">E</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="err">&#39;</span><span class="py">featured</span><span class="err">&#39;</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">product</span><span class="err">.</span><span class="py">tags</span><span class="w"> </span></span></span></code></pre></div> <h3 id="solutions" class="position-relative d-flex align-items-center group"> <span>Solutions</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="solutions" aria-haspopup="dialog" aria-label="Share link: Solutions"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><details> <summary>Exercise 1 Solution</summary> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">B</span><span class="err">-</span><span class="py">tree</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">range</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">event_timestamp_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Event</span><span class="p">(</span><span class="py">timestamp</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Verify</span><span class="w"> </span><span class="py">usage</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">EXPLAIN</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">e</span><span class="p">:</span><span class="nc">Event</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">1609500000</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">1609700000</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">e</span><span class="err">.</span><span class="py">timestamp</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Should</span><span class="w"> </span><span class="py">show</span><span class="w"> </span><span class="py">IndexScan</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">event_timestamp_idx</span><span class="w"> </span></span></span></code></pre></div></details> <details> <summary>Exercise 2 Solution</summary> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Column</span><span class="w"> </span><span class="py">order</span><span class="p">:</span><span class="w"> </span><span class="nc">equality</span><span class="w"> </span><span class="py">first</span><span class="p">,</span><span class="w"> </span><span class="py">then</span><span class="w"> </span><span class="py">range</span><span class="p">,</span><span class="w"> </span><span class="py">then</span><span class="w"> </span><span class="py">equality</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">country</span><span class="w"> </span><span class="p">(</span><span class="py">equality</span><span class="p">,</span><span class="w"> </span><span class="py">medium</span><span class="w"> </span><span class="py">selectivity</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">age</span><span class="w"> </span><span class="p">(</span><span class="py">range</span><span class="p">,</span><span class="w"> </span><span class="py">high</span><span class="w"> </span><span class="py">selectivity</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">active</span><span class="w"> </span><span class="p">(</span><span class="py">equality</span><span class="p">,</span><span class="w"> </span><span class="py">low</span><span class="w"> </span><span class="py">selectivity</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_country_age_active_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">User</span><span class="p">(</span><span class="py">country</span><span class="p">,</span><span class="w"> </span><span class="py">age</span><span class="p">,</span><span class="w"> </span><span class="py">active</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Alternative</span><span class="w"> </span><span class="p">(</span><span class="py">if</span><span class="w"> </span><span class="py">age</span><span class="w"> </span><span class="py">range</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">wide</span><span class="p">):</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_country_active_age_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">User</span><span class="p">(</span><span class="py">country</span><span class="p">,</span><span class="w"> </span><span class="py">active</span><span class="p">,</span><span class="w"> </span><span class="py">age</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Verify</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">EXPLAIN</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">country</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">USA</span><span class="err">&#39;</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">25</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">active</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">email</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div></details> <details> <summary>Exercise 3 Solution</summary> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">A</span><span class="p">:</span><span class="w"> </span><span class="nc">Hash</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="p">(</span><span class="py">exact</span><span class="w"> </span><span class="py">match</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_email_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">User</span><span class="p">(</span><span class="py">email</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">hash</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">B</span><span class="p">:</span><span class="w"> </span><span class="nc">B</span><span class="err">-</span><span class="py">tree</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="p">(</span><span class="py">range</span><span class="w"> </span><span class="kd">query</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">product_price_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Product</span><span class="p">(</span><span class="py">price</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">C</span><span class="p">:</span><span class="w"> </span><span class="nc">Full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">article_content_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Article</span><span class="p">(</span><span class="py">content</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">fulltext</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">D</span><span class="p">:</span><span class="w"> </span><span class="nc">Vector</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="p">(</span><span class="py">similarity</span><span class="w"> </span><span class="py">search</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">image_embedding_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Image</span><span class="p">(</span><span class="py">embedding</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">vector</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">E</span><span class="p">:</span><span class="w"> </span><span class="nc">Bloom</span><span class="w"> </span><span class="py">filter</span><span class="w"> </span><span class="p">(</span><span class="py">membership</span><span class="w"> </span><span class="py">testing</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">product_tags_idx</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Product</span><span class="p">(</span><span class="py">tags</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">bloom</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div></details> <h3 id="troubleshooting" class="position-relative d-flex align-items-center group"> <span>Troubleshooting</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="troubleshooting" aria-haspopup="dialog" aria-label="Share link: Troubleshooting"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="index-not-used-by-optimizer" class="position-relative d-flex align-items-center group"> <span>Index Not Used by Optimizer</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="index-not-used-by-optimizer" aria-haspopup="dialog" aria-label="Share link: Index Not Used by Optimizer"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Problem</strong>: EXPLAIN shows SeqScan despite index existing</p> <p><strong>Solutions</strong>:</p> <ol> <li>Update statistics: <code>ANALYZE Person;</code></li> <li>Check index covers query columns</li> <li>Verify WHERE clause uses indexed columns</li> <li>Try composite index for multiple predicates</li> <li>Check data distribution (very small tables may use SeqScan)</li> </ol> <h4 id="slow-index-creation" class="position-relative d-flex align-items-center group"> <span>Slow Index Creation</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="slow-index-creation" aria-haspopup="dialog" aria-label="Share link: Slow Index Creation"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Problem</strong>: CREATE INDEX takes too long</p> <p><strong>Solutions</strong>:</p> <ol> <li>Build indexes during maintenance windows</li> <li>Use <code>CONCURRENTLY</code> option (if available)</li> <li>Increase memory for index build</li> <li>Consider smaller sample size for partial indexes</li> </ol> <h4 id="query-slower-after-adding-index" class="position-relative d-flex align-items-center group"> <span>Query Slower After Adding Index</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="query-slower-after-adding-index" aria-haspopup="dialog" aria-label="Share link: Query Slower After Adding Index"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Problem</strong>: Performance degraded post-indexing</p> <p><strong>Solutions</strong>:</p> <ol> <li>Update statistics: <code>ANALYZE</code></li> <li>Check if wrong index chosen</li> <li>Consider dropping conflicting indexes</li> <li>Verify index type matches query pattern</li> <li>Check write overhead on heavily updated tables</li> </ol> <h3 id="next-steps" class="position-relative d-flex align-items-center group"> <span>Next Steps</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="next-steps" aria-haspopup="dialog" aria-label="Share link: Next Steps"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Continue your learning journey:</p> <ol> <li><strong><a href="/docs/tutorials/graph-algorithms-tutorial/" >Graph Algorithms Tutorial</a> </strong> - PageRank, centrality, community detection</li> <li><strong><a href="/docs/performance/" >Performance Tuning Guide</a> </strong> - Advanced optimization techniques</li> <li><strong><a href="/docs/gql/guide/" >Query Language Reference</a> </strong> - Complete GQL syntax</li> <li><strong><a href="/docs/query/indexing-and-optimization/" >Indexing Guide</a> </strong> - Comprehensive indexing documentation</li> </ol> <h3 id="quick-reference" class="position-relative d-flex align-items-center group"> <span>Quick Reference</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="quick-reference" aria-haspopup="dialog" aria-label="Share link: Quick Reference"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="index-commands" class="position-relative d-flex align-items-center group"> <span>Index Commands</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="index-commands" aria-haspopup="dialog" aria-label="Share link: Index Commands"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">idx_name</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Label</span><span class="p">(</span><span class="py">property</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Composite</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">idx_name</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Label</span><span class="p">(</span><span class="py">prop1</span><span class="p">,</span><span class="w"> </span><span class="py">prop2</span><span class="p">)</span><span class="w"> </span><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Drop</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">DROP</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">idx_name</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">List</span><span class="w"> </span><span class="py">indexes</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SHOW</span><span class="w"> </span><span class="py">INDEXES</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Label</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Update</span><span class="w"> </span><span class="py">statistics</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ANALYZE</span><span class="w"> </span><span class="py">Label</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="index-types" class="position-relative d-flex align-items-center group"> <span>Index Types</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="index-types" aria-haspopup="dialog" aria-label="Share link: Index Types"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">USING</span><span class="w"> </span><span class="py">btree</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Range</span><span class="w"> </span><span class="py">queries</span><span class="p">,</span><span class="w"> </span><span class="py">ordering</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</span><span class="w"> </span><span class="py">hash</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Exact</span><span class="w"> </span><span class="py">matches</span><span class="w"> </span><span class="kd">on</span><span class="py">ly</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</span><span class="w"> </span><span class="py">fulltext</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Text</span><span class="w"> </span><span class="py">search</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</span><span class="w"> </span><span class="py">vector</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Similarity</span><span class="w"> </span><span class="py">search</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</span><span class="w"> </span><span class="py">bloom</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Membership</span><span class="w"> </span><span class="py">testing</span><span class="w"> </span></span></span></code></pre></div> <h4 id="query-analysis" class="position-relative d-flex align-items-center group"> <span>Query Analysis</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="query-analysis" aria-haspopup="dialog" aria-label="Share link: Query Analysis"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">EXPLAIN</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Show</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">plan</span><span class="w"> </span><span class="p">(</span><span class="py">no</span><span class="w"> </span><span class="py">execution</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">PROFILE</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Execute</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">show</span><span class="w"> </span><span class="py">performance</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ANALYZE</span><span class="w"> </span><span class="py">Label</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Update</span><span class="w"> </span><span class="py">statistics</span><span class="w"> </span></span></span></code></pre></div><hr> <p><strong>Tutorial Complete!</strong> You now understand indexing and query optimization in Geode.</p> <p><strong>Next</strong>: <a href="/docs/tutorials/graph-algorithms-tutorial/" >Graph Algorithms Tutorial</a> </p>