Hacker News

Три рівні кешу між Select і Disk

Три рівні кешу між Select і Disk Це дослідження заглиблюється в три, вивчаючи його значення та потенційний вплив. — Mewayz Business OS.

4 min read

Mewayz Team

Editorial Team

Hacker News

Коли ваша програма запускає інструкцію SELECT, цей запит майже ніколи не торкається диска, що обертається, або навіть необробленого флеш-пам’яті — він проходить через три окремі рівні кешу, які мовчки визначають, через мікросекунди чи мілісекунди надходить ваша відповідь. Розуміння цих рівнів є різницею між бізнес-платформою, яка легко масштабується, і тією, яка прогинається під реальним навантаженням.

Що відбувається в той момент, коли запит SELECT залишає вашу програму?

У той момент, коли ваша програма надсилає запит SELECT, вона потрапляє в конвеєр, який більшість розробників ніколи не перевіряють. Механізм бази даних перехоплює запит перед початком будь-якого вводу-виводу, розбираючи SQL у внутрішній план виконання та негайно звертаючись до своєї першої лінії захисту: кеша результатів запиту. Якщо нещодавно було виконано ідентичний запит з ідентичними параметрами, механізм може повернути кешований набір результатів, не торкаючись жодної сторінки даних. Це іноді називають кеш-пам’яттю запитів або кеш-пам’яттю результатів, і на робочих навантаженнях із високим рівнем читання та низьким рівнем запису — як-от інформаційні панелі аналітики та модулі звітності — це може повністю усунути переважну більшість читань диска.

Важливе розуміння тут полягає в тому, що кеш запитів дуже чутливий до мутацій даних. Будь-яке INSERT, UPDATE або DELETE проти базової таблиці робить відповідні кешовані результати недійсними. Ось чому транзакційні системи, які потребують великого запису, часто повністю відключають кеш запитів і замість цього покладаються на більш глибокі рівні.

Що таке буферний пул і чому він важливіший, ніж ви думаєте?

Другий рівень кешу — і, мабуть, найважливіший у виробничих системах — це буферний пул (називається спільним буфером у PostgreSQL, буферним пулом InnoDB у MySQL). Це область оперативної пам’яті, яку використовує механізм бази даних для зберігання нещодавно доступних сторінок даних. Якщо запит не може бути надано з кешу результатів, механізм перевіряє, чи необхідні сторінки даних вже знаходяться в пулі буферів, перш ніж виконувати будь-яке читання диска.

Буферний пул працює за принципом часової та просторової локальності: доступ до даних, до яких нещодавно було отримано нещодавно, швидше за все, буде доступний знову, а дані, що зберігаються поблизу даних, до яких доступ був доступний, швидше за все, доступ незабаром буде доступний. Адміністратори баз даних налаштовують розмір пулу буферів як одне з найважливіших рішень щодо конфігурації, які вони приймають. Занадто малий пул буферів спричиняє постійне видалення сторінок, що спричиняє явище, яке називається трешингом, коли система витрачає більше часу на керування промахами кешу, ніж на виконання запитів.

Ключова інформація: у більшості робочих навантажень OLTP великий пул буферів означає, що 95–99% усіх зчитувань даних обслуговуються з оперативної пам’яті. Робочий набір — підмножина ваших даних, до якої насправді часто звертаються запити — часто набагато менший за загальний розмір бази даних. Вибір розміру пулу буферів відповідно до робочого набору, а не всього набору даних, є єдиною дією налаштування з найвищою віддачею, яку ви можете виконати.

💡 ВИ ЗНАЛИ?

Mewayz замінює 8+ бізнес-інструментів в одній платформі

CRM · Виставлення рахунків · HR · Проєкти · Бронювання · eCommerce · POS · Аналітика. Безкоштовний план назавжди.

Почати безкоштовно →

Як кеш операційної системи заповнює прогалину між оперативною пам’яттю та диском?

Навіть якщо власний пул буферів бази даних відсутній, запит ще не призначений для справжнього читання диска. Операційна система підтримує кеш сторінок (також званий кеш файлової системи), область оперативної пам’яті, керованої ядром, яка буферизує читання та запис на блокові пристрої. Коли механізм бази даних запитує сторінку, яка відсутня в пулі буферів, ядро ​​ОС перевіряє власний кеш сторінок перед тим, як надіслати команду фізичного введення/виведення контролеру зберігання.

Цей третій рівень здебільшого невидимий для розробників додатків, але дуже важливий у системах, де пул буферів бази даних недостатньо забезпечений. Кеш сторінок ОС спільний для всіх процесів, тому він конкурує з сервером додатків, веб-сервером і будь-яким іншим програмним забезпеченням, що працює на тому самому хості. На виділених серверах баз даних ця конкуренція мінімальна, а кеш ОС забезпечує значущий буфер другого шансу. На спільних хостах або контейнерах із жорсткими обмеженнями пам’яті кеш ОС часто занадто малий, щоб допомогти.

Який рівень кешу відповідає за найбільше підвищення продуктивності на практиці?

У реальних виробничих системах буферний пул домінує над продуктивністю

Frequently Asked Questions

Does disabling the query cache always improve database performance?

Not always, but for write-heavy workloads it typically does. The query cache requires a global mutex to maintain consistency, which becomes a bottleneck under high concurrency. MySQL 8.0 removed the query cache entirely for this reason. PostgreSQL never implemented a built-in query cache, relying instead on the buffer pool and application-layer caching. If your read-to-write ratio is high and your queries are highly repetitive, a query cache can deliver real gains — otherwise, invest that tuning effort in the buffer pool.

How do I know if my buffer pool is sized correctly?

Monitor your buffer pool hit ratio: the percentage of page requests served from the pool versus those requiring a disk read. A hit ratio below 95% on an OLTP workload is a signal to increase pool size. In MySQL, query SHOW ENGINE INNODB STATUS and look at the buffer pool hit rate. In PostgreSQL, the pg_statio_user_tables view exposes heap blocks read from disk versus served from the buffer pool. Aim to keep your entire working set — not your full dataset — resident in RAM.

What is the relationship between cache layers and multi-tenant SaaS reliability?

In multi-tenant SaaS, cache layers prevent "noisy neighbor" problems where one tenant's heavy query load degrades performance for all other tenants. Tenant-aware application caching with TTL-based invalidation keeps per-tenant hot data in Redis, drastically reducing buffer pool pressure from large accounts. Database-level connection pooling combined with a warm buffer pool ensures that burst activity from any single account does not flush shared pages from cache and cause latency spikes across the platform.


Cache layers are not database trivia — they are the architectural foundation that separates platforms that stay fast at scale from those that require constant infrastructure firefighting. If you are building or running a business that needs a platform already optimized for these realities, explore Mewayz at app.mewayz.com — 207 modules, one coherent platform, built to perform reliably from your first user to your hundred-thousandth.

Спробуйте Mewayz безкоштовно

Універсальна платформа для CRM, виставлення рахунків, проектів, HR та іншого. Без кредитної картки.

Пов'язаний посібник

Керівництво з управління персоналом →

Керуйте вашою командою ефективно: профілі співробітників, управління відпустками, зарплата та оцінка ефективності.

Почніть керувати своїм бізнесом розумніше вже сьогодні.

Приєднуйтесь до 30,000+ компаній. Безплатний тариф назавжди · Без кредитної картки.

Знайшли це корисним? Поділіться цим.

Готові застосувати це на практиці?

Приєднуйтесь до 30,000+ бізнесів, які використовують Mewayz. Безкоштовний тариф назавжди — кредитна карта не потрібна.

Почати пробний період →

Готові вжити заходів?

Почніть свій безкоштовний пробний період Mewayz сьогодні

Бізнес-платформа все в одному. Кредитна картка не потрібна.

Почати безкоштовно →

14-денний безкоштовний пробний період · Без кредитної картки · Скасуйте в будь-який час