<!-- 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’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">"Person_1"</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">"Seattle"</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">"Person_2"</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">"Portland"</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">"Person_3"</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">"Seattle"</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">"Person_4"</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">"San Francisco"</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">"Person_5"</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">"Seattle"</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">'</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">></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 > 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 'person_age_idx' 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>></code>, <code><</code>, <code>>=</code>, <code><=</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"><label>_<property>_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">></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 > 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 > 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’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">></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 > 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 'person_city_age_idx' 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">'</span><span class="py">Seattle</span><span class="err">'</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">></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">'</span><span class="py">Seattle</span><span class="err">'</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">></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 > 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">></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">'</span><span class="py">user</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</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">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">'%</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">'</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">"graph database"</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"><</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">'</span><span class="py">database</span><span class="err">'</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>></code>, <code><</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">></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">'</span><span class="py">Seattle</span><span class="err">'</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 > 30 AND city = 'Seattle'
</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’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 'Person'
</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 (>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">'1h'</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 'person_age_idx' 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">"Laptop"</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">"Electronics"</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">"Mouse"</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">"Electronics"</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">"Desk"</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">"Furniture"</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">"Chair"</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">"Furniture"</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">"Monitor"</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">"Electronics"</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">'</span><span class="py">Electronics</span><span class="err">'</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"><</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">></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">'</span><span class="py">Electronics</span><span class="err">'</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"><</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">></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 > 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 = 'Electronics' AND price < 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">'</span><span class="py">Electronics</span><span class="err">'</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"><</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">></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’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’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">"Event_1"</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">"Event_2"</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">"Event_3"</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">"Event_4"</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">></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"><</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">'</span><span class="py">USA</span><span class="err">'</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">></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">'</span><span class="py">alice</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</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="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">"graph database"</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"><</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">'</span><span class="py">featured</span><span class="err">'</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">></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"><</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">'</span><span class="py">USA</span><span class="err">'</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">></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>
Indexing and Query Optimization Tutorial
Comprehensive tutorial for creating indexes, using EXPLAIN and PROFILE, and optimizing GQL queries for maximum performance in Geode