<!-- 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">"[email protected]"</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">"[email protected]"</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 < ? 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]->(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">"[email protected]"</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">"NodeIndexSeek"</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">"NodeByLabelScan"</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><</code>, <code>></code>, <code><=</code>, <code>>=</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"><</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">"usr_12345"</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">></span><span class="w"> </span><span class="s">"usr_10000"</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">'</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’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">"USA"</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">"NYC"</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">"USA"</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">"NYC"</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">'</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">"product_search"</span><span class="p">,</span><span class="w"> </span><span class="s">"wireless bluetooth"</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">"[email protected]"</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">"USA"</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">"San Francisco"</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 “covers” 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">"[email protected]"</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">"[email protected]"</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">"USA"</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">"USA"</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">"NYC"</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">"USA"</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">"NYC"</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">"10001"</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">"NYC"</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">"10001"</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">"USA"</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">"10001"</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">"pending"</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">></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">"pending"</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"><</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">"USA"</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">"NYC"</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">"NodeIndexSeek"</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">"NodeByLabelScan"</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">"Acme Corp"</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">"MATCH (u:User {email: $email}) RETURN u"</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">"user_email"</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">"POPULATING"</span><span class="w"> </span><span class="py">then</span><span class="w"> </span><span class="s">"ONLINE"</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">"[email protected]"</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">"[email protected]"</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>
Index Strategy Guide
Design effective indexing strategies for optimal Geode query performance
10 min read