AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

Interação direta do banco de dados com a memória - como funciona?

  • 772

Estou lendo um livro sobre bancos de dados e um capítulo dele fala sobre o gerenciador de buffer e suas estratégias de substituição.

Percebi que o DBMS interage diretamente com a memória, em vez de solicitar que o SO interaja com a memória virtual. Isso é correto? Como exatamente essa comunicação direta ocorre? Quanta memória o DBMS pode alocar? Eu nunca fui exposto a chamadas de função de baixo nível e adoraria ver algumas explicações e exemplos disso.

Obter esse tipo de informação é meio complicado de encontrar no google se você não souber as palavras-chave corretas para pesquisar.

mysql mariadb
  • 1 1 respostas
  • 81 Views

1 respostas

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

    Vamos falar sobre MySQL/MariaDB apenas com ENGINE=InnoDB. (Esse é praticamente o único mecanismo em uso hoje.)

    • Todas as atividades do InnoDB acontecem no buffer_pool.
    • Todos os dados e cada índice secundário são compostos por blocos de 16 KB.
    • Esses blocos são trazidos para o buffer_pool conforme necessário e liberados conforme necessário.
    • Ele usa um algoritmo LRU (menos usado recentemente) para controlar quais blocos serão eliminados. (Existem pequenos ajustes no LRU, então não é exatamente LRU.)

    Portanto, é muito importante dar ao InnoDB a maior parte da RAM e deixá-lo fazer o seu trabalho. Uma regra simples: innodb_buffer_pool_sizedeve ser definido para cerca de 70% da RAM. Para a maioria dos aplicativos, essa é a configuração mais importante e a única que precisa ser alterada do padrão.

    Definir o buffer_pool muito grande pode levar à troca. Mas, como o InnoDB o trata como um grande array, isso pode causar uma quantidade terrível de trocas, diminuindo a velocidade do MySQL/MariaDB terrivelmente.

    O InnoDB possui threads para leitura de blocos de escrita. Em particular, a descarga para o disco é um pouco feita "em segundo plano". Isso permite que um INSERTpareça ser mais rápido do que realmente é.

    Eu discuto a alocação de memória mais adiante aqui

    Usar "memória virtual" para acessar um arquivo é uma maneira preguiçosa de fazer as coisas. Funciona bem para casos simples. No entanto, um mecanismo de banco de dados precisa ser eficiente e rápido. Quando o código conhece o padrão de acesso, é melhor usar um método de acesso ajustado para tal.

    Por exemplo, se você for ler um arquivo sequencialmente, é melhor (para gerenciamento de memória) fazer ping-ping entre dois buffers 'pequenos'; um sendo lido e um sendo analisado. (Um único buffer "circular" é uma boa alternativa.)

    Como exatamente essa comunicação direta ocorre?

    Como tudo está em blocos de 16KB, existe um número que identifica exclusivamente tal. É bastante grande (20? bytes). Inclui pelo menos o número do "tablespace" e o número do bloco dentro do tablespace. Isso é tomado como módulo do número de buffer_pool_instances para decidir em qual instância procurar.

    Dentro de um bloco, existem linhas da tabela ou linhas de um índice secundário, ou linhas de um nó na B+Tree (ver Wikipedia) que ele representa.

    Se o bloco não estiver no buffer_pool, ele deverá aguardar enquanto ocorre uma leitura. Mas, antes que a leitura possa ocorrer, pode ser necessário haver uma gravação para liberar algum bloco. Normalmente, um thread em segundo plano libera blocos "sujos" para que sempre haja alguns blocos livres no buffer_pool. ("Grátis" ou "facilmente removidos" porque não estão sujos.)

    • 1

relate perguntas

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve