<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-28 --> <h2 id="index-strategy-guide" class="position-relative d-flex align-items-center group"> <span>Index Strategy Guide</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-strategy-guide" aria-haspopup="dialog" aria-label="Share link: Index Strategy Guide"> <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>Indexes are the foundation of query performance in Geode. This guide helps you analyze your query patterns, choose appropriate index types, and maintain indexes effectively.</p> <h3 id="index-fundamentals" class="position-relative d-flex align-items-center group"> <span>Index Fundamentals</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-fundamentals" aria-haspopup="dialog" aria-label="Share link: Index Fundamentals"> <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="what-indexes-do" class="position-relative d-flex align-items-center group"> <span>What Indexes Do</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-indexes-do" aria-haspopup="dialog" aria-label="Share link: What Indexes Do"> <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>Indexes create auxiliary data structures that allow Geode to find nodes quickly without scanning all nodes with a given label. Without an index, finding a user by email requires examining every User node:</p> <p><strong>Without index</strong> - O(n) scan:</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">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">email</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&#34;[email protected]&#34;</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="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">Scans</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">User</span><span class="w"> </span><span class="py">nodes</span><span class="w"> </span></span></span></code></pre></div><p><strong>With index</strong> - O(log n) lookup:</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">After</span><span class="p">:</span><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_email</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</span><span class="p">)</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="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;[email protected]&#34;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</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">Direct</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">lookup</span><span class="w"> </span></span></span></code></pre></div> <h4 id="index-types-in-geode" class="position-relative d-flex align-items-center group"> <span>Index Types in Geode</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-in-geode" aria-haspopup="dialog" aria-label="Share link: Index Types in Geode"> <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>Geode supports several index types:</p> <table> <thead> <tr> <th>Type</th> <th>Use Case</th> <th>Example</th> </tr> </thead> <tbody> <tr> <td><strong>B-tree</strong></td> <td>Equality, range queries</td> <td><code>CREATE INDEX ON :User(age)</code></td> </tr> <tr> <td><strong>Hash</strong></td> <td>Equality only (faster)</td> <td><code>CREATE HASH INDEX ON :User(id)</code></td> </tr> <tr> <td><strong>Composite</strong></td> <td>Multi-property lookups</td> <td><code>CREATE INDEX ON :User(country, city)</code></td> </tr> <tr> <td><strong>Full-text</strong></td> <td>Text search</td> <td><code>CREATE FULLTEXT INDEX ON :Product(name, description)</code></td> </tr> <tr> <td><strong>Unique</strong></td> <td>Enforce uniqueness + index</td> <td><code>CREATE CONSTRAINT ON :User(email) ASSERT UNIQUE</code></td> </tr> </tbody> </table> <h3 id="analyzing-query-patterns" class="position-relative d-flex align-items-center group"> <span>Analyzing Query Patterns</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="analyzing-query-patterns" aria-haspopup="dialog" aria-label="Share link: Analyzing Query Patterns"> <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="identify-high-frequency-queries" class="position-relative d-flex align-items-center group"> <span>Identify High-Frequency 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="identify-high-frequency-queries" aria-haspopup="dialog" aria-label="Share link: Identify High-Frequency 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><p>Before creating indexes, understand your query patterns:</p> <ol> <li><strong>Log production queries</strong> to identify the most frequent</li> <li><strong>Profile critical paths</strong> in your application</li> <li><strong>Review slow query logs</strong> for optimization candidates</li> </ol> <p><strong>Example analysis</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Query Pattern Frequency Avg Time </span></span><span class="line"><span class="cl">-------------------------------------------- --------- -------- </span></span><span class="line"><span class="cl">MATCH (u:User {email: ?}) 100k/day 45ms </span></span><span class="line"><span class="cl">MATCH (p:Product) WHERE p.price &lt; ? 50k/day 120ms </span></span><span class="line"><span class="cl">MATCH (o:Order {status: ?}) 30k/day 80ms </span></span><span class="line"><span class="cl">MATCH (u:User)-[:PURCHASED]-&gt;(p:Product) 20k/day 15ms </span></span></code></pre></div> <h4 id="identify-index-candidates" class="position-relative d-flex align-items-center group"> <span>Identify Index Candidates</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="identify-index-candidates" aria-haspopup="dialog" aria-label="Share link: Identify Index Candidates"> <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>From the analysis above, prioritize:</p> <ol> <li><strong>High frequency + high latency</strong>: Product price queries</li> <li><strong>High frequency</strong>: User email lookups</li> <li><strong>Moderate frequency + moderate latency</strong>: Order status queries</li> </ol> <h4 id="check-existing-index-usage" class="position-relative d-flex align-items-center group"> <span>Check Existing Index Usage</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="check-existing-index-usage" aria-haspopup="dialog" aria-label="Share link: Check Existing Index Usage"> <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>See which indexes exist and their usage:</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">Show</span><span class="w"> </span><span class="py">all</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></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">Output</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="p">|</span><span class="w"> </span><span class="nc">name</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="kd">type</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="nc">label</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">properties</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">state</span><span class="w"> </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="p">|</span><span class="err">--------------</span><span class="p">|</span><span class="err">---------</span><span class="p">|</span><span class="err">---------</span><span class="p">|</span><span class="err">---------------</span><span class="p">|</span><span class="err">--------</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="p">|</span><span class="w"> </span><span class="py">user_email</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">BTREE</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">User</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="p">[</span><span class="py">email</span><span class="p">]</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">ONLINE</span><span class="w"> </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="p">|</span><span class="w"> </span><span class="py">product_name</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">BTREE</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">Product</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="p">[</span><span class="py">name</span><span class="p">]</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">ONLINE</span><span class="w"> </span><span class="p">|</span><span class="w"> </span></span></span></code></pre></div><p>Use EXPLAIN to verify index usage:</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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;[email protected]&#34;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</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">Look</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="s">&#34;NodeIndexSeek&#34;</span><span class="w"> </span><span class="py">instead</span><span class="w"> </span><span class="py">of</span><span class="w"> </span><span class="s">&#34;NodeByLabelScan&#34;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="choosing-the-right-index-type" class="position-relative d-flex align-items-center group"> <span>Choosing the Right Index Type</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="choosing-the-right-index-type" aria-haspopup="dialog" aria-label="Share link: Choosing the Right Index Type"> <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="b-tree-indexes" class="position-relative d-flex align-items-center group"> <span>B-tree 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="b-tree-indexes" aria-haspopup="dialog" aria-label="Share link: B-tree 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>The default and most versatile index type. Use for:</p> <ul> <li>Equality comparisons (<code>=</code>)</li> <li>Range queries (<code>&lt;</code>, <code>&gt;</code>, <code>&lt;=</code>, <code>&gt;=</code>)</li> <li>Prefix matching (<code>STARTS WITH</code>)</li> <li>Sorting (<code>ORDER BY</code>)</li> </ul> <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></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_price</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Product</span><span class="p">(</span><span class="py">price</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">Supports</span><span class="w"> </span><span class="py">these</span><span class="w"> </span><span class="py">queries</span><span class="p">:</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">p</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">price</span><span class="p">:</span><span class="w"> </span><span class="nc">99</span><span class="mf">.99</span><span class="p">})</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="w"> </span><span class="err">//</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="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 class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">price</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">100</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="w"> </span><span class="err">//</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">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 class="py">WHERE</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="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 class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Range</span><span class="w"> </span></span></span></code></pre></div> <h4 id="hash-indexes" class="position-relative d-flex align-items-center group"> <span>Hash 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="hash-indexes" aria-haspopup="dialog" aria-label="Share link: Hash 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>Faster than B-tree for equality only. Use when:</p> <ul> <li>Only equality lookups needed</li> <li>No range queries on this property</li> <li>Maximum lookup performance required</li> </ul> <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">hash</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">HASH</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_id</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">id</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">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">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="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;usr_12345&#34;</span><span class="p">})</span><span class="w"> </span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</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">suitable</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">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 class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">id</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="s">&#34;usr_10000&#34;</span><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Won</span><span class="err">&#39;</span><span class="py">t</span><span class="w"> </span><span class="py">use</span><span class="w"> </span><span class="py">hash</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span></code></pre></div> <h4 id="composite-indexes" class="position-relative d-flex align-items-center group"> <span>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="composite-indexes" aria-haspopup="dialog" aria-label="Share link: 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>Index multiple properties together. Use when:</p> <ul> <li>Queries filter on multiple properties</li> <li>Specific property combinations are common</li> <li>Single-property indexes aren&rsquo;t selective enough</li> </ul> <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">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">user_location</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">country</span><span class="p">,</span><span class="w"> </span><span class="py">city</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">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">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="w"> </span><span class="p">{</span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;USA&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;NYC&#34;</span><span class="p">})</span><span class="w"> </span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</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">full</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">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="w"> </span><span class="p">{</span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;USA&#34;</span><span class="p">})</span><span class="w"> </span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</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">index</span><span class="w"> </span><span class="py">prefix</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">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="w"> </span><span class="p">{</span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;NYC&#34;</span><span class="p">})</span><span class="w"> </span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Can</span><span class="err">&#39;</span><span class="py">t</span><span class="w"> </span><span class="py">use</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="p">(</span><span class="py">missing</span><span class="w"> </span><span class="py">leading</span><span class="w"> </span><span class="py">property</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h4 id="full-text-indexes" class="position-relative d-flex align-items-center group"> <span>Full-Text 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="full-text-indexes" aria-haspopup="dialog" aria-label="Share link: Full-Text 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>For text search operations. Use when:</p> <ul> <li>Searching within text content</li> <li>Need CONTAINS or fuzzy matching</li> <li>Building search functionality</li> </ul> <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">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">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">product_search</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Product</span><span class="p">(</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">description</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">with</span><span class="w"> </span><span class="py">full</span><span class="err">-</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">CALL</span><span class="w"> </span><span class="py">db</span><span class="err">.</span><span class="py">index</span><span class="err">.</span><span class="py">fulltext</span><span class="err">.</span><span class="kd">query</span><span class="nc">Nodes</span><span class="p">(</span><span class="s">&#34;product_search&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;wireless bluetooth&#34;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">YIELD</span><span class="w"> </span><span class="py">node</span><span class="p">,</span><span class="w"> </span><span class="py">score</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">node</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">score</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">score</span><span class="w"> </span><span class="py">DESC</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="unique-constraints" class="position-relative d-flex align-items-center group"> <span>Unique Constraints</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="unique-constraints" aria-haspopup="dialog" aria-label="Share link: Unique Constraints"> <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>Enforce uniqueness while creating an implicit 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="err">//</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">unique</span><span class="w"> </span><span class="py">constraint</span><span class="w"> </span><span class="p">(</span><span class="py">also</span><span class="w"> </span><span class="py">creates</span><span class="w"> </span><span class="py">index</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">CONSTRAINT</span><span class="w"> </span><span class="py">user_email_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">Automatically</span><span class="w"> </span><span class="py">indexed</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">enforces</span><span class="w"> </span><span class="py">uniqueness</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="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;[email protected]&#34;</span><span class="p">})</span><span class="w"> </span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="w"> </span></span></span></code></pre></div> <h3 id="index-coverage-and-selectivity" class="position-relative d-flex align-items-center group"> <span>Index Coverage and Selectivity</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-coverage-and-selectivity" aria-haspopup="dialog" aria-label="Share link: Index Coverage and Selectivity"> <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="understanding-selectivity" class="position-relative d-flex align-items-center group"> <span>Understanding Selectivity</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-selectivity" aria-haspopup="dialog" aria-label="Share link: Understanding Selectivity"> <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>Selectivity</strong> measures how well an index narrows down results. High selectivity is better.</p> <table> <thead> <tr> <th>Property</th> <th>Unique Values</th> <th>Total Nodes</th> <th>Selectivity</th> </tr> </thead> <tbody> <tr> <td>email</td> <td>1,000,000</td> <td>1,000,000</td> <td>100% (excellent)</td> </tr> <tr> <td>country</td> <td>200</td> <td>1,000,000</td> <td>0.02% (poor)</td> </tr> <tr> <td>status</td> <td>5</td> <td>1,000,000</td> <td>0.0005% (very poor)</td> </tr> </tbody> </table> <p><strong>High selectivity</strong> (good index candidates):</p> <ul> <li>User IDs, emails, usernames</li> <li>Product SKUs, ISBNs</li> <li>Order numbers, transaction IDs</li> </ul> <p><strong>Low selectivity</strong> (poor index candidates alone):</p> <ul> <li>Boolean flags (active/inactive)</li> <li>Status fields (few values)</li> <li>Country codes</li> </ul> <h4 id="improving-selectivity-with-composite-indexes" class="position-relative d-flex align-items-center group"> <span>Improving Selectivity with 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="improving-selectivity-with-composite-indexes" aria-haspopup="dialog" aria-label="Share link: Improving Selectivity with 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>Combine low-selectivity properties for better performance:</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">Poor</span><span class="p">:</span><span class="w"> </span><span class="nc">Low</span><span class="w"> </span><span class="py">selectivity</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">country</span><span class="w"> </span><span class="py">alone</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_country</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">country</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">Better</span><span class="p">:</span><span class="w"> </span><span class="nc">Composite</span><span class="w"> </span><span class="py">improves</span><span class="w"> </span><span class="py">selectivity</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_country_city</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">country</span><span class="p">,</span><span class="w"> </span><span class="py">city</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">benefits</span><span class="w"> </span><span class="py">from</span><span class="w"> </span><span class="py">higher</span><span class="w"> </span><span class="py">combined</span><span class="w"> </span><span class="py">selectivity</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="w"> </span><span class="p">{</span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;USA&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;San Francisco&#34;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="w"> </span></span></span></code></pre></div> <h4 id="index-coverage" class="position-relative d-flex align-items-center group"> <span>Index Coverage</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-coverage" aria-haspopup="dialog" aria-label="Share link: Index Coverage"> <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>An index &ldquo;covers&rdquo; a query when all needed data is in the index itself, avoiding node lookup:</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">Covered</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="nc">index</span><span class="w"> </span><span class="py">has</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">needed</span><span class="w"> </span><span class="py">properties</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">Index</span><span class="p">:</span><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">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">)</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="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;[email protected]&#34;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Retrieved</span><span class="w"> </span><span class="py">from</span><span class="w"> </span><span class="py">index</span><span class="p">,</span><span class="w"> </span><span class="py">no</span><span class="w"> </span><span class="py">node</span><span class="w"> </span><span class="py">access</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">Non</span><span class="err">-</span><span class="py">covered</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="nc">requires</span><span class="w"> </span><span class="py">node</span><span class="w"> </span><span class="py">access</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="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;[email protected]&#34;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">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">created_at</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">created_at</span><span class="w"> </span><span class="py">not</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span></code></pre></div><p>Consider covering indexes for your most critical 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="err">//</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">covering</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">common</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">user_email_profile</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">avatar_url</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">This</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">is</span><span class="w"> </span><span class="py">fully</span><span class="w"> </span><span class="py">covered</span><span class="p">:</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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="nv">$email</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">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">avatar_url</span><span class="w"> </span></span></span></code></pre></div> <h3 id="composite-index-ordering" class="position-relative d-flex align-items-center group"> <span>Composite Index Ordering</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="composite-index-ordering" aria-haspopup="dialog" aria-label="Share link: Composite Index Ordering"> <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="property-order-matters" class="position-relative d-flex align-items-center group"> <span>Property Order Matters</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="property-order-matters" aria-haspopup="dialog" aria-label="Share link: Property Order Matters"> <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>In composite indexes, the order of properties affects which queries can use the 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="err">//</span><span class="w"> </span><span class="py">Index</span><span class="p">:</span><span class="w"> </span><span class="p">(</span><span class="nc">country</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">zip</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_geo</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">country</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">zip</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">Can</span><span class="w"> </span><span class="py">use</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="p">(</span><span class="py">matches</span><span class="w"> </span><span class="py">prefix</span><span class="p">):</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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;USA&#34;</span><span class="p">})</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="nc">Uses</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">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="w"> </span><span class="p">{</span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;USA&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;NYC&#34;</span><span class="p">})</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="nc">Uses</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">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="w"> </span><span class="p">{</span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;USA&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;NYC&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">zip</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;10001&#34;</span><span class="p">})</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="nc">Uses</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></span><span class="line"><span class="cl"><span class="w"></span><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">index</span><span class="w"> </span><span class="p">(</span><span class="py">skips</span><span class="w"> </span><span class="py">prefix</span><span class="p">):</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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;NYC&#34;</span><span class="p">})</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="nc">Full</span><span class="w"> </span><span class="py">scan</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="w"> </span><span class="p">{</span><span class="py">zip</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;10001&#34;</span><span class="p">})</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="nc">Full</span><span class="w"> </span><span class="py">scan</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="w"> </span><span class="p">{</span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;USA&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">zip</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;10001&#34;</span><span class="p">})</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="nc">Partial</span><span class="w"> </span><span class="py">scan</span><span class="w"> </span></span></span></code></pre></div> <h4 id="ordering-guidelines" class="position-relative d-flex align-items-center group"> <span>Ordering 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="ordering-guidelines" aria-haspopup="dialog" aria-label="Share link: Ordering 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><ol> <li><strong>Most filtered first</strong>: Put the most commonly filtered property first</li> <li><strong>High selectivity first</strong>: Put more selective properties earlier</li> <li><strong>Equality before range</strong>: Equality predicates should precede range predicates</li> </ol> <p><strong>Example</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">Query</span><span class="w"> </span><span class="py">pattern</span><span class="p">:</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">o</span><span class="p">:</span><span class="nc">Order</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">o</span><span class="err">.</span><span class="py">status</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&#34;pending&#34;</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">o</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="nv">$since</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">o</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">Good</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">order</span><span class="w"> </span><span class="p">(</span><span class="py">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></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">order_status_date</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Order</span><span class="p">(</span><span class="py">status</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</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">Poor</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">order</span><span class="w"> </span><span class="p">(</span><span class="py">range</span><span class="w"> </span><span class="py">first</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">order_date_status</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Order</span><span class="p">(</span><span class="py">created_at</span><span class="p">,</span><span class="w"> </span><span class="py">status</span><span class="p">)</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Less</span><span class="w"> </span><span class="py">efficient</span><span class="w"> </span></span></span></code></pre></div> <h4 id="multiple-index-strategies" class="position-relative d-flex align-items-center group"> <span>Multiple Index Strategies</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="multiple-index-strategies" aria-haspopup="dialog" aria-label="Share link: Multiple Index Strategies"> <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 different query patterns, you may need multiple 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">Query</span><span class="w"> </span><span class="py">1</span><span class="p">:</span><span class="w"> </span><span class="nc">Filter</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">status</span><span class="p">,</span><span class="w"> </span><span class="py">sort</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">date</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">o</span><span class="p">:</span><span class="nc">Order</span><span class="w"> </span><span class="p">{</span><span class="py">status</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;pending&#34;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">o</span><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">o</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span><span class="py">DESC</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">2</span><span class="p">:</span><span class="w"> </span><span class="nc">Filter</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">customer</span><span class="p">,</span><span class="w"> </span><span class="py">sort</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">date</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">o</span><span class="p">:</span><span class="nc">Order</span><span class="w"> </span><span class="p">{</span><span class="py">customer_id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">o</span><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">o</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span><span class="py">DESC</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">indexes</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">both</span><span class="w"> </span><span class="py">patterns</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">order_status_date</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Order</span><span class="p">(</span><span class="py">status</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</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">order_customer_date</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Order</span><span class="p">(</span><span class="py">customer_id</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h3 id="index-maintenance-overhead" class="position-relative d-flex align-items-center group"> <span>Index Maintenance Overhead</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-maintenance-overhead" aria-haspopup="dialog" aria-label="Share link: Index Maintenance Overhead"> <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="write-performance-impact" class="position-relative d-flex align-items-center group"> <span>Write Performance Impact</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="write-performance-impact" aria-haspopup="dialog" aria-label="Share link: Write Performance Impact"> <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>Every index adds overhead to write operations:</p> <table> <thead> <tr> <th>Operation</th> <th>Without Index</th> <th>With 1 Index</th> <th>With 3 Indexes</th> </tr> </thead> <tbody> <tr> <td>CREATE</td> <td>1x</td> <td>1.2x</td> <td>1.6x</td> </tr> <tr> <td>SET</td> <td>1x</td> <td>1.1x (if indexed prop)</td> <td>1.3x</td> </tr> <tr> <td>DELETE</td> <td>1x</td> <td>1.2x</td> <td>1.6x</td> </tr> </tbody> </table> <h4 id="memory-usage" class="position-relative d-flex align-items-center group"> <span>Memory Usage</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="memory-usage" aria-haspopup="dialog" aria-label="Share link: Memory Usage"> <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>Indexes consume memory. Monitor index memory:</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">Check</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">sizes</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CALL</span><span class="w"> </span><span class="py">db</span><span class="err">.</span><span class="py">indexes</span><span class="p">()</span><span class="w"> </span><span class="py">YIELD</span><span class="w"> </span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">size</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">name</span><span class="p">,</span><span class="w"> </span><span class="py">size</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">size</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span></code></pre></div> <h4 id="balancing-read-vs-write-performance" class="position-relative d-flex align-items-center group"> <span>Balancing Read vs Write 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="balancing-read-vs-write-performance" aria-haspopup="dialog" aria-label="Share link: Balancing Read vs Write 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> </h4><p>Consider your workload characteristics:</p> <p><strong>Read-heavy workloads</strong> (90% reads, 10% writes):</p> <ul> <li>More indexes are acceptable</li> <li>Prioritize query performance</li> <li>Consider covering indexes</li> </ul> <p><strong>Write-heavy workloads</strong> (30% reads, 70% writes):</p> <ul> <li>Minimize indexes</li> <li>Only index critical query paths</li> <li>Avoid redundant indexes</li> </ul> <p><strong>Balanced workloads</strong>:</p> <ul> <li>Index selectively</li> <li>Monitor both read and write latencies</li> <li>Review index usage periodically</li> </ul> <h3 id="monitoring-index-usage" class="position-relative d-flex align-items-center group"> <span>Monitoring Index Usage</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="monitoring-index-usage" aria-haspopup="dialog" aria-label="Share link: Monitoring Index Usage"> <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="check-index-statistics" class="position-relative d-flex align-items-center group"> <span>Check 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="check-index-statistics" aria-haspopup="dialog" aria-label="Share link: Check 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> </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">View</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">usage</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">CALL</span><span class="w"> </span><span class="py">db</span><span class="err">.</span><span class="py">indexes</span><span class="p">()</span><span class="w"> </span><span class="py">YIELD</span><span class="w"> </span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="kd">type</span><span class="p">,</span><span class="w"> </span><span class="nc">state</span><span class="p">,</span><span class="w"> </span><span class="py">populationPercent</span><span class="p">,</span><span class="w"> </span><span class="py">size</span><span class="p">,</span><span class="w"> </span><span class="py">usageCount</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">name</span><span class="p">,</span><span class="w"> </span><span class="kd">type</span><span class="p">,</span><span class="w"> </span><span class="nc">state</span><span class="p">,</span><span class="w"> </span><span class="py">populationPercent</span><span class="p">,</span><span class="w"> </span><span class="py">size</span><span class="p">,</span><span class="w"> </span><span class="py">usageCount</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">usageCount</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span></code></pre></div> <h4 id="identify-unused-indexes" class="position-relative d-flex align-items-center group"> <span>Identify Unused 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="identify-unused-indexes" aria-haspopup="dialog" aria-label="Share link: Identify Unused 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>Indexes with zero or low usage count may be candidates for removal:</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">Find</span><span class="w"> </span><span class="py">potentially</span><span class="w"> </span><span class="py">unused</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">CALL</span><span class="w"> </span><span class="py">db</span><span class="err">.</span><span class="py">indexes</span><span class="p">()</span><span class="w"> </span><span class="py">YIELD</span><span class="w"> </span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">usageCount</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">usageCount</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">100</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Threshold</span><span class="w"> </span><span class="py">depends</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">your</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">RETURN</span><span class="w"> </span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">usageCount</span><span class="w"> </span></span></span></code></pre></div> <h4 id="profile-query-index-usage" class="position-relative d-flex align-items-center group"> <span>Profile Query Index Usage</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="profile-query-index-usage" aria-haspopup="dialog" aria-label="Share link: Profile Query Index Usage"> <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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;USA&#34;</span><span class="p">,</span><span class="w"> </span><span class="nc">city</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;NYC&#34;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</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">Check</span><span class="w"> </span><span class="py">output</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="err">//</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="s">&#34;NodeIndexSeek&#34;</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nc">index</span><span class="w"> </span><span class="py">used</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="err">-</span><span class="w"> </span><span class="s">&#34;NodeByLabelScan&#34;</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">used</span><span class="w"> </span></span></span></code></pre></div> <h3 id="when-not-to-index" class="position-relative d-flex align-items-center group"> <span>When NOT to 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="when-not-to-index" aria-haspopup="dialog" aria-label="Share link: When NOT to 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> <h4 id="avoid-indexing" class="position-relative d-flex align-items-center group"> <span>Avoid Indexing</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="avoid-indexing" aria-haspopup="dialog" aria-label="Share link: Avoid Indexing"> <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>Low-selectivity properties</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">Poor</span><span class="p">:</span><span class="w"> </span><span class="nc">Boolean</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="err">~</span><span class="py">50</span><span class="err">/</span><span class="py">50</span><span class="w"> </span><span class="py">distribution</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_active</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">active</span><span class="p">)</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Only</span><span class="w"> </span><span class="py">2</span><span class="w"> </span><span class="py">values</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">Usually</span><span class="w"> </span><span class="py">better</span><span class="p">:</span><span class="w"> </span><span class="nc">Combine</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">other</span><span class="w"> </span><span class="py">properties</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_active_created</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">active</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div><p><strong>Rarely queried properties</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">Avoid</span><span class="p">:</span><span class="w"> </span><span class="nc">Internal</span><span class="w"> </span><span class="py">metadata</span><span class="w"> </span><span class="py">rarely</span><span class="w"> </span><span class="py">searched</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_internal_notes</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">internal_notes</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div><p><strong>Frequently updated properties</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">Avoid</span><span class="p">:</span><span class="w"> </span><span class="nc">Properties</span><span class="w"> </span><span class="py">that</span><span class="w"> </span><span class="py">change</span><span class="w"> </span><span class="py">constantly</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_last_seen</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">last_seen_at</span><span class="p">)</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Updates</span><span class="w"> </span><span class="py">every</span><span class="w"> </span><span class="py">request</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">Better</span><span class="p">:</span><span class="w"> </span><span class="nc">Batch</span><span class="w"> </span><span class="py">updates</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">different</span><span class="w"> </span><span class="py">strategy</span><span class="w"> </span></span></span></code></pre></div><p><strong>Very large text properties</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">Avoid</span><span class="p">:</span><span class="w"> </span><span class="nc">Large</span><span class="w"> </span><span class="py">text</span><span class="w"> </span><span class="py">blobs</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</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Article</span><span class="p">(</span><span class="py">content</span><span class="p">)</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">May</span><span class="w"> </span><span class="py">be</span><span class="w"> </span><span class="py">megabytes</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">Better</span><span class="p">:</span><span class="w"> </span><span class="nc">Use</span><span class="w"> </span><span class="py">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 class="py">for</span><span class="w"> </span><span class="py">searchable</span><span class="w"> </span><span class="py">content</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">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">article_search</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Article</span><span class="p">(</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">summary</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h4 id="alternative-strategies" class="position-relative d-flex align-items-center group"> <span>Alternative Strategies</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="alternative-strategies" aria-haspopup="dialog" aria-label="Share link: Alternative Strategies"> <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>Denormalization</strong> instead of indexing:</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">Instead</span><span class="w"> </span><span class="py">of</span><span class="w"> </span><span class="py">indexing</span><span class="w"> </span><span class="py">deep</span><span class="w"> </span><span class="py">traversals</span><span class="p">,</span><span class="w"> </span><span class="py">denormalize</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">Add</span><span class="w"> </span><span class="py">commonly</span><span class="w"> </span><span class="py">needed</span><span class="w"> </span><span class="py">data</span><span class="w"> </span><span class="py">directly</span><span class="w"> </span><span class="py">to</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">SET</span><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">company_name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&#34;Acme Corp&#34;</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Avoid</span><span class="w"> </span><span class="py">JOIN</span><span class="err">/</span><span class="py">traverse</span><span class="w"> </span></span></span></code></pre></div><p><strong>Materialized aggregates</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">Instead</span><span class="w"> </span><span class="py">of</span><span class="w"> </span><span class="py">counting</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">every</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="err">//</span><span class="w"> </span><span class="nc">Maintain</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">count</span><span class="w"> </span><span class="py">property</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">post_count</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">post_count</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">1</span><span class="w"> </span></span></span></code></pre></div><p><strong>Application-level caching</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Cache frequently accessed, rarely changed data</span> </span></span><span class="line"><span class="cl"><span class="nd">@cache</span><span class="p">(</span><span class="n">ttl</span><span class="o">=</span><span class="mi">3600</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="k">def</span> <span class="nf">get_user_by_email</span><span class="p">(</span><span class="n">email</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">db</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;MATCH (u:User {email: $email}) RETURN u&#34;</span><span class="p">,</span> <span class="n">email</span><span class="o">=</span><span class="n">email</span><span class="p">)</span> </span></span></code></pre></div> <h3 id="index-creation-best-practices" class="position-relative d-flex align-items-center group"> <span>Index Creation 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="index-creation-best-practices" aria-haspopup="dialog" aria-label="Share link: Index Creation 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="naming-conventions" class="position-relative d-flex align-items-center group"> <span>Naming Conventions</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="naming-conventions" aria-haspopup="dialog" aria-label="Share link: Naming Conventions"> <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>Use descriptive, consistent names:</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">Good</span><span class="p">:</span><span class="w"> </span><span class="nc">label_property</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">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_email</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</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_sku</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Product</span><span class="p">(</span><span class="py">sku</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">order_status_date</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Order</span><span class="p">(</span><span class="py">status</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</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">Good</span><span class="p">:</span><span class="w"> </span><span class="nc">Include</span><span class="w"> </span><span class="py">purpose</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">special</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">user_search_name</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">normalized_name</span><span class="p">)</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">For</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">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_unique_email</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</span><span class="p">)</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Unique</span><span class="w"> </span><span class="py">constraint</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">Avoid</span><span class="p">:</span><span class="w"> </span><span class="nc">Cryptic</span><span class="w"> </span><span class="py">names</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">idx1</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</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">ue</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h4 id="creating-indexes-in-production" class="position-relative d-flex align-items-center group"> <span>Creating Indexes in Production</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="creating-indexes-in-production" aria-haspopup="dialog" aria-label="Share link: Creating Indexes in Production"> <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>Create indexes asynchronously to avoid blocking:</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">index</span><span class="w"> </span><span class="p">(</span><span class="py">may</span><span class="w"> </span><span class="py">block</span><span class="w"> </span><span class="py">queries</span><span class="w"> </span><span class="py">during</span><span class="w"> </span><span class="py">build</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</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</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">Monitor</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">build</span><span class="w"> </span><span class="py">progress</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></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">&#34;user_email&#34;</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">State</span><span class="w"> </span><span class="py">will</span><span class="w"> </span><span class="py">be</span><span class="w"> </span><span class="s">&#34;POPULATING&#34;</span><span class="w"> </span><span class="py">then</span><span class="w"> </span><span class="s">&#34;ONLINE&#34;</span><span class="w"> </span></span></span></code></pre></div><p>For large databases, schedule index creation during low-traffic periods.</p> <h4 id="testing-index-effectiveness" class="position-relative d-flex align-items-center group"> <span>Testing Index Effectiveness</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="testing-index-effectiveness" aria-haspopup="dialog" aria-label="Share link: Testing Index Effectiveness"> <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>Before deploying new indexes:</p> <ol> <li><strong>Test in staging</strong> with production-like data</li> <li><strong>Profile before and after</strong>:</li> </ol> <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">Before</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">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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;[email protected]&#34;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</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">Note</span><span class="p">:</span><span class="w"> </span><span class="nc">NodeByLabelScan</span><span class="p">,</span><span class="w"> </span><span class="py">rows</span><span class="w"> </span><span class="py">examined</span><span class="p">,</span><span class="w"> </span><span class="py">time</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">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">user_email</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</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">After</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">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">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;[email protected]&#34;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">RETURN</span><span class="w"> </span><span class="py">u</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">Note</span><span class="p">:</span><span class="w"> </span><span class="nc">NodeIndexSeek</span><span class="p">,</span><span class="w"> </span><span class="py">rows</span><span class="w"> </span><span class="py">examined</span><span class="p">,</span><span class="w"> </span><span class="py">time</span><span class="w"> </span></span></span></code></pre></div><ol start="3"> <li><strong>Monitor write performance</strong> for regression</li> </ol> <h3 id="index-strategy-checklist" class="position-relative d-flex align-items-center group"> <span>Index Strategy Checklist</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-strategy-checklist" aria-haspopup="dialog" aria-label="Share link: Index Strategy Checklist"> <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>When designing your index strategy:</p> <ul> <li><input disabled="" type="checkbox"> <strong>Analyzed query patterns</strong> - Know your most frequent and critical queries</li> <li><input disabled="" type="checkbox"> <strong>Identified selective properties</strong> - Focus on high-cardinality fields</li> <li><input disabled="" type="checkbox"> <strong>Chosen appropriate types</strong> - B-tree, hash, composite, or full-text</li> <li><input disabled="" type="checkbox"> <strong>Ordered composite indexes correctly</strong> - Equality before range, selective first</li> <li><input disabled="" type="checkbox"> <strong>Considered write impact</strong> - Balance read performance with write overhead</li> <li><input disabled="" type="checkbox"> <strong>Planned for monitoring</strong> - Track index usage and query performance</li> <li><input disabled="" type="checkbox"> <strong>Documented decisions</strong> - Record why each index exists</li> <li><input disabled="" type="checkbox"> <strong>Scheduled reviews</strong> - Periodically audit index effectiveness</li> </ul> <h3 id="common-index-patterns" class="position-relative d-flex align-items-center group"> <span>Common Index Patterns</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="common-index-patterns" aria-haspopup="dialog" aria-label="Share link: Common Index Patterns"> <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="user-lookup-pattern" class="position-relative d-flex align-items-center group"> <span>User Lookup Pattern</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="user-lookup-pattern" aria-haspopup="dialog" aria-label="Share link: User Lookup Pattern"> <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">Primary</span><span class="w"> </span><span class="py">lookup</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">ID</span><span class="w"> </span><span class="p">(</span><span class="py">unique</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">CONSTRAINT</span><span class="w"> </span><span class="py">user_id_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">id</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">Login</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">email</span><span class="w"> </span><span class="p">(</span><span class="py">unique</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">CONSTRAINT</span><span class="w"> </span><span class="py">user_email_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">Search</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">username</span><span class="w"> </span><span class="p">(</span><span class="py">frequent</span><span class="w"> </span><span class="py">lookups</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_username</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">username</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">Filter</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">status</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">date</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_status_created</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">status</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h4 id="e-commerce-pattern" class="position-relative d-flex align-items-center group"> <span>E-commerce Pattern</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="e-commerce-pattern" aria-haspopup="dialog" aria-label="Share link: E-commerce Pattern"> <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">Product</span><span class="w"> </span><span class="py">lookup</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">CONSTRAINT</span><span class="w"> </span><span class="py">product_sku_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Product</span><span class="p">(</span><span class="py">sku</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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_category_price</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">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></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">product_search</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Product</span><span class="p">(</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">description</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">Order</span><span class="w"> </span><span class="py">lookup</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">CONSTRAINT</span><span class="w"> </span><span class="py">order_number_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Order</span><span class="p">(</span><span class="py">order_number</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">order_customer_date</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Order</span><span class="p">(</span><span class="py">customer_id</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</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">order_status_date</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Order</span><span class="p">(</span><span class="py">status</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h4 id="social-network-pattern" class="position-relative d-flex align-items-center group"> <span>Social Network Pattern</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="social-network-pattern" aria-haspopup="dialog" aria-label="Share link: Social Network Pattern"> <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">User</span><span class="w"> </span><span class="py">lookup</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">CONSTRAINT</span><span class="w"> </span><span class="py">user_handle_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">handle</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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_name</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">name</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">Post</span><span class="w"> </span><span class="py">lookup</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">post_author_date</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</span><span class="py">author_id</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</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">post_visibility_date</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</span><span class="py">visibility</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</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">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">post_content</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</span><span class="py">text</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h3 id="summary" class="position-relative d-flex align-items-center group"> <span>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="summary" aria-haspopup="dialog" aria-label="Share link: 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> </h3><p>Effective index strategy requires:</p> <ol> <li><strong>Understanding your queries</strong>: Know what you search for and how often</li> <li><strong>Choosing the right type</strong>: Match index type to query pattern</li> <li><strong>Optimizing selectivity</strong>: Index high-cardinality properties</li> <li><strong>Ordering composites correctly</strong>: Equality first, then range, most selective first</li> <li><strong>Balancing trade-offs</strong>: Consider write overhead and memory usage</li> <li><strong>Monitoring continuously</strong>: Track usage and remove unused indexes</li> </ol> <h3 id="related-guides" class="position-relative d-flex align-items-center group"> <span>Related Guides</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="related-guides" aria-haspopup="dialog" aria-label="Share link: Related Guides"> <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><a href="/guides/query-performance/" >Query Performance Guide</a> - Write efficient queries</li> <li><a href="/guides/query-profiling/" >Query Profiling Guide</a> - Analyze execution plans</li> <li><a href="/guides/graph-modeling/" >Graph Modeling Guide</a> - Schema design for performance</li> </ul> <hr> <p><strong>Questions?</strong> Discuss indexing strategies in our <a href="https://forum.geodedb.com" aria-label="forum – opens in new window" target="_blank" rel="noopener noreferrer" >forum <span aria-hidden="true" class="external-icon">↗</span> </a> .</p>