AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 244543
Accepted
sanjihan
sanjihan
Asked: 2019-08-06 01:44:03 +0800 CST2019-08-06 01:44:03 +0800 CST 2019-08-06 01:44:03 +0800 CST

数据库与内存的直接交互——它是如何工作的?

  • 772

我正在阅读一本关于数据库的书,其中的一章讨论了缓冲区管理器及其替代策略。

我注意到 DBMS 直接与内存交互,而不是要求操作系统与虚拟内存交互。那是对的吗?这种直接的沟通究竟是如何发生的?DBMS 允许分配多少内存?我从来没有接触过如此低级的函数调用,我很想看到一些解释和例子。

如果您不知道要搜索的正确关键字,那么在 google 上查找此类信息有点麻烦。

mysql mariadb
  • 1 1 个回答
  • 81 Views

1 个回答

  • Voted
  1. Best Answer
    Rick James
    2019-08-06T10:48:55+08:002019-08-06T10:48:55+08:00

    让我们只讨论 ENGINE=InnoDB 的 MySQL/MariaDB。(这实际上是当今唯一使用的引擎。)

    • 所有 InnoDB 活动都发生在 buffer_pool 中。
    • 所有数据和每个二级索引由 16KB 块组成。
    • 这些块根据需要被带入 buffer_pool,并根据需要刷新。
    • 它使用 LRU(最近最少使用)算法来控制要弹出的块。(LRU 有一些小的调整,所以它不完全是LRU。)

    因此,给 InnoDB大部分RAM,然后让它做它的事情是非常重要的。一个简单的经验法则: innodb_buffer_pool_size应设置为大约 70% 的 RAM。对于大多数应用程序,这是最重要的设置,也是唯一需要更改默认设置的设置。

    将 buffer_pool 设置得太大可能会导致交换。但是,由于 InnoDB 将其视为一个大数组,这可能会导致大量的交换,从而大大降低 MySQL/MariaDB 的速度。

    InnoDB 具有用于读取写入块的线程。特别是,刷新到磁盘在某种程度上是“在后台”完成的。这使得 anINSERT看起来比实际更快。

    我在这里进一步讨论内存分配

    使用“虚拟内存”访问文件是一种懒惰的做事方式。它适用于简单的情况。但是,数据库引擎需要高效且快速。当代码知道访问模式时,最好使用为此调整的访问方法。

    例如,如果您要按顺序读取文件,最好(用于内存管理)在两个“小”缓冲区之间进行 ping-ping;一个被读入,一个被解析。(单个“循环”缓冲区是一个不错的选择。)

    这种直接的沟通究竟是如何发生的?

    因为所有内容都在 16KB 块中,所以有一个数字可以唯一标识此类内容。它相当大(20?字节)。它至少包括“表空间”号,以及表空间内的块号。这是取模 buffer_pool_instances 的数量来决定查看哪个实例。

    在一个块内,有表的行或二级索引的行,或它所代表的 B+Tree(参见 Wikipedia)中的节点的行。

    如果块不在 buffer_pool 中,它必须在读取发生时等待。但是,在读取发生之前,可能需要写入以清除某些块。通常,后台线程会刷新“脏”块,以便在 buffer_pool 中始终存在一些空闲块。(“免费”或“容易移除”,因为它们不脏。)

    • 1

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve