Open Source Database Software, Support and Services - Percona
` : ''; return `
${hit.title}
${img}
${hit.description || ''}
`; } search.addWidgets([ instantsearch.widgets.index({ indexName: 'percona_main_site' }).addWidgets([ instantsearch.widgets.configure({ hitsPerPage: resultsPerPage }), instantsearch.widgets.hits({ container: '#results1 .hits', templates: { item: hitTemplate } }), instantsearch.widgets.pagination({ container: '#results1 .pagination' }), makeStatsWidget('results1'), ]) ]); search.addWidgets([ instantsearch.widgets.index({ indexName: 'percona_docs_pages' }).addWidgets([ instantsearch.widgets.configure({ hitsPerPage: resultsPerPage }), instantsearch.widgets.hits({ container: '#results2 .hits', templates: { item: hitTemplate } }), instantsearch.widgets.pagination({ container: '#results2 .pagination' }), makeStatsWidget('results2'), ]) ]); search.addWidgets([ instantsearch.widgets.index({ indexName: 'percona_blog_articles' }).addWidgets([ instantsearch.widgets.configure({ hitsPerPage: resultsPerPage }), instantsearch.widgets.hits({ container: '#results3 .hits', templates: { item: hitTemplate } }), instantsearch.widgets.pagination({ container: '#results3 .pagination' }), makeStatsWidget('results3'), ]) ]); search.addWidgets([ instantsearch.widgets.index({ indexName: 'percona_community_blog_pages' }).addWidgets([ instantsearch.widgets.configure({ hitsPerPage: resultsPerPage }), instantsearch.widgets.hits({ container: '#results4 .hits', templates: { item: hitTemplate } }), instantsearch.widgets.pagination({ container: '#results4 .pagination' }), makeStatsWidget('results4'), ]) ]); search.on('render', () => { clearActive(); scheduleReposition(); // reset the "user picked a tab" pin whenever the query changes const q = (search.helper ? search.helper.state.query : '').trim(); if (q !== lastQuery) { lastQuery = q; userChoseTab = false; } if (q !== '') maybeAutoSwitch(); }); search.start(); function getInput() { return container.querySelector('.ais-SearchBox-input'); } function openPopup() { updateDropPositions(); popupEl.classList.add('open'); const input = getInput(); if (input) input.setAttribute('aria-expanded', 'true'); } function closePopup() { popupEl.classList.remove('open'); clearActive(); const input = getInput(); if (input) input.setAttribute('aria-expanded', 'false'); } function setupCombobox() { const input = getInput(); if (!input) return; input.setAttribute('role', 'combobox'); input.setAttribute('aria-expanded', 'false'); input.setAttribute('aria-controls', 'search-popup'); input.setAttribute('aria-haspopup', 'listbox'); input.setAttribute('aria-autocomplete', 'list'); input.setAttribute('aria-label', 'Search percona.com'); } setupCombobox(); function visibleHitLinks() { const activePanel = popupEl.querySelector('.results.active'); return activePanel ? Array.from(activePanel.querySelectorAll('.hit-link')) : []; } function clearActive() { activeIndex = -1; popupEl.querySelectorAll('.hit-link.is-active').forEach(el => { el.classList.remove('is-active'); el.removeAttribute('aria-selected'); }); const input = getInput(); if (input) input.removeAttribute('aria-activedescendant'); } function setActive(index) { const links = visibleHitLinks(); if (!links.length) return; activeIndex = (index + links.length) % links.length; links.forEach((el, i) => { const on = i === activeIndex; el.classList.toggle('is-active', on); if (on) { if (!el.id) el.id = 'hit-option-' + i; el.setAttribute('aria-selected', 'true'); el.scrollIntoView({ block: 'nearest' }); const input = getInput(); if (input) input.setAttribute('aria-activedescendant', el.id); } else { el.removeAttribute('aria-selected'); } }); } document.querySelectorAll('.search-popup .tab').forEach(tab => { tab.addEventListener('click', () => activateTab(tab, { byUser: true })); tab.addEventListener('keydown', (e) => { const tabsArr = Array.from(document.querySelectorAll('.search-popup .tab')); const i = tabsArr.indexOf(tab); let next = null; if (e.key === 'ArrowRight') next = tabsArr[(i + 1) % tabsArr.length]; if (e.key === 'ArrowLeft') next = tabsArr[(i - 1 + tabsArr.length) % tabsArr.length]; if (next) { e.preventDefault(); next.focus(); activateTab(next, { byUser: true }); } }); }); function activateTab(tab, opts = {}) { if (opts.byUser) userChoseTab = true; document.querySelectorAll('.search-popup .tab').forEach(t => { t.classList.remove('active'); t.setAttribute('aria-selected', 'false'); t.setAttribute('tabindex', '-1'); }); document.querySelectorAll('.search-popup .results').forEach(r => r.classList.remove('active')); tab.classList.add('active'); tab.setAttribute('aria-selected', 'true'); tab.setAttribute('tabindex', '0'); document.getElementById(tab.dataset.target).classList.add('active'); clearActive(); } function expandSearch() { updateDropPositions(); container.classList.add('expanded'); const delay = isDropdownMode() ? 0 : 260; setTimeout(() => { // the wrap is laid out by now, so measure it for real — measuring too // early estimated 56px and let the popup slide under the input bar, // hiding the tab row and the first hit updateDropPositions(); const input = getInput(); if (input) { input.focus(); if (input.value.trim() !== '') openPopup(); } }, delay); } // focusIcon: only when the user deliberately dismissed the search (close // button, Escape, icon toggle). On an outside click focus belongs wherever // they clicked, so don't yank it back to the header. function collapseSearch(opts = {}) { const { focusIcon = true } = opts; const input = getInput(); if (input) { input.value = ''; search.helper.setQuery('').search(); } closePopup(); container.classList.remove('expanded'); if (focusIcon) iconBtn.focus(); } iconBtn.addEventListener('click', () => { if (isDropdownMode() && container.classList.contains('expanded')) { collapseSearch(); } else { expandSearch(); } }); collapseBtn.addEventListener('click', collapseSearch); container.addEventListener('keydown', (e) => { const input = getInput(); if (!input || e.target !== input) return; if (e.key === 'Enter') { e.preventDefault(); const links = visibleHitLinks(); if (popupEl.classList.contains('open') && activeIndex >= 0 && links[activeIndex]) { links[activeIndex].click(); } else { const q = input.value.trim(); if (q !== '') goToSearchPage(q); } return; } if (!popupEl.classList.contains('open')) return; if (e.key === 'ArrowDown') { e.preventDefault(); setActive(activeIndex + 1); } else if (e.key === 'ArrowUp') { e.preventDefault(); setActive(activeIndex - 1); } else if (e.key === 'Home' && activeIndex >= 0) { e.preventDefault(); setActive(0); } else if (e.key === 'End' && activeIndex >= 0) { e.preventDefault(); setActive(visibleHitLinks().length - 1); } }); popupEl.addEventListener('mousemove', (e) => { const link = e.target.closest('.hit-link'); if (!link) { if (activeIndex !== -1) clearActive(); return; } const links = visibleHitLinks(); const i = links.indexOf(link); if (i !== -1 && i !== activeIndex) setActive(i); }); popupEl.addEventListener('mouseleave', () => { clearActive(); }); document.addEventListener('focusin', (e) => { if (container.contains(e.target) && e.target.matches('.ais-SearchBox-input')) { if (e.target.value.trim() !== '') openPopup(); } }); /* Outside-click close. First/Prev/Last pagination controls become disabled after the refinement they trigger, so InstantSearch swaps the clicked for a . By the time the click reaches this listener the original node is detached and container.contains(e.target) is false — which used to close the panel. composedPath() is captured at dispatch time and still contains the container; the pointerdown flag is a fallback for anything that doesn't expose it. */ let pressedInside = false; document.addEventListener('pointerdown', (e) => { pressedInside = container.contains(e.target); }, true); document.addEventListener('click', (e) => { const path = typeof e.composedPath === 'function' ? e.composedPath() : null; const inside = path ? path.includes(container) : container.contains(e.target); if (inside || pressedInside) return; // full collapse, not just closePopup() — leaving the expanded input bar // behind puts it on top of whatever nav menu the user just opened if (container.classList.contains('expanded')) collapseSearch({ focusIcon: false }); else closePopup(); }); // keyboard equivalent: tabbing or focusing into a nav menu also dismisses it document.addEventListener('focusin', (e) => { if (!container.classList.contains('expanded')) return; if (container.contains(e.target)) return; collapseSearch({ focusIcon: false }); }); document.addEventListener('keydown', (e) => { if (e.key !== 'Escape') return; if (popupEl.classList.contains('open')) { closePopup(); const input = getInput(); if (input) input.focus(); } else if (container.classList.contains('expanded')) { collapseSearch(); } }); })();

Open Source Database Software & Experts

Your Database.
No License Fees.
Zero Lock-In.
The Way Is Open.

Open Source MySQL, PostgreSQL, Valkey and MongoDB®, backed by experts, 24/7, so they stay fast and reliable. No traps, no BS, just freedom to go farther.

Database Technology

Any Environment. Any Database.
No Restrictions On What Fits.

MySQL

Get enterprise features and zero licensing fees, fully open source.

MongoDB®

Escape proprietary lock-in before the costs start spiraling.

PostgreSQL

Encrypt, scale, and run PostgreSQL free of proprietary extensions.

Valkey / Redis

A founding governance seat, not just a support contract.

THE WAY IS OPEN THE WAY IS OPEN THE WAY IS OPEN THE WAY IS OPEN THE WAY IS OPEN THE WAY IS OPEN

Solution Use Cases

SOLVE. INNOVATE.
BE FREE.

Cost Optimization

Cut licensing waste, reduce cloud overprovisioning, and meet price and performance goals.

Performance and Reliability at Scale

Maintain consistent performance, low latency, and high availability as workloads scale.

Security, Sovereignty, and Compliance

Transparent, verifiable database security that keeps data control, governance, and compliance in your hands.

Future-Ready Architecture (AI & Emerging Workloads)

Modernize for AI, analytics, and hybrid data workloads without replatforming, feature lock-in, or unpredictable cost models.

Reviews

What Our
Customers Say

From startups to global platforms, teams rely on Percona expertise to keep open source databases performing reliably in demanding production environments.

"Percona’s support has given us the confidence to push the boundaries of what’s possible, knowing that ourdatabases are in the best hands.”
 - Stuart Alexander, LeadByte
“While we believe and rely on MongoDB® as a technology, we decided to choose Percona as we could get more control over our database strategy. We reduced our cost, got better control over our future strategy, and improved results.”
- David Jimenez Ausin, BBVA
"Percona technical support is not only crucial when it comes to saving the Trend Micro GIS team time when troubleshooting, it also enhances our DBA Linux-based database skills." - Chenhsi Li, Senior Manager, Global Infrastructure Services 
- Private Cloud Team, Trend Micro
“One of our biggest goals was to have peace of mind, knowing that our databases are safe, backed up, and running smoothly, and Percona has more than delivered on that.”
- Hirad Roshandel, Property.ca Inc.
ryan air logo

“Partnering with Percona was the best decision for our team. I would recommend Percona to anyone who needs enterprise support, whether cloud-based or on-prem.”

Diego Infiesta
IT Infrastructure Manager at Ryanair

Still running databases the hard way?

Talk to us about your stack, or download the software and start today.
No licence needed. No lock-in.
MySQL, PostgreSQL, InnoDB, MariaDB, MongoDB and Kubernetes are trademarks for their respective owners.
© 2026 Percona All Rights Reserved