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 / 50905
Accepted
Jose Nobile
Jose Nobile
Asked: 2013-10-03 11:45:27 +0800 CST2013-10-03 11:45:27 +0800 CST 2013-10-03 11:45:27 +0800 CST

MySQL armazena BLOB no buffer pool innodb (innodb_buffer_pool_size)?

  • 772

Tenho vários bancos de dados todos em INNODB, 50GB são BLOBcolunas, apenas 700MB não são BLOBdados. Ferramentas como mysqltuner me pedem para definir innodb_buffer_pool_size = 51GB.

O MySQL armazena o BLOB na RAM? Se sim, como posso configurar o MYSQL para que ele não use innodb_buffer_pool_size para armazenar BLOB?

mysql innodb
  • 2 2 respostas
  • 1830 Views

2 respostas

  • Voted
  1. Michael - sqlbot
    2013-10-03T19:00:53+08:002013-10-03T19:00:53+08:00

    A parte 1 da resposta à sua pergunta é não, você não pode dizer seletivamente ao MySQL o que não armazenar no buffer pool do InnoDB. É parte integrante de como o InnoDB manipula os dados da tabela.

    A parte 2 é que você realmente não quer ou precisa, porque é inteligente o suficiente para descobrir o que deve permanecer lá se o pool não for grande o suficiente para reter todo o conjunto de dados.

    A propósito, devo ter mencionado anteriormente ... não confie em scripts de ajuste.

    Na melhor das hipóteses, eles podem fornecer "coisas interessantes" para investigar e ler, mas é absolutamente impossível "ajustar" adequadamente um servidor MySQL sem entender a natureza dos dados que estão naquele servidor ... e você está apenas provavelmente ajustará seu desempenho para baixo ou para cima.

    O InnoDB não carrega nada no buffer pool que não seja de alguma forma útil. Deixe um servidor MySQL recém-reiniciado sozinho, sem executar nenhuma consulta, e o buffer pool ficará lá, alocado, mas quase vazio. SELECTde uma tabela, e algumas páginas do espaço de tabela dessa tabela no disco serão carregadas no pool, mas geralmente não todas. Quais páginas dependem de quais linhas você recupera, quais índices são necessários para encontrá-las, se está fazendo leitura antecipada, etc.

    UPDATEuma tabela e as páginas com as linhas que você atualizar serão carregadas no pool, modificadas no pool e depois gravadas de volta no disco em segundo plano. INSERTe DELETEtrazer as páginas para o pool e, por fim, liberá-las de volta para o disco também.

    Mas o InnoDB acompanha o quão "útil" é o que está atualmente no pool de buffer, quão recentemente foi necessário, se alguma alteração já foi gravada no disco ou não e removerá as páginas para abrir espaço para outras páginas quando o pool for cheio. Muitos dos meus servidores de produção têm um pool de buffer InnoDB menor que o conjunto de dados do servidor e essencialmente 100% cheio 100% do tempo, mas não há impacto no desempenho quando uma grande quantidade de dados não foi acessada por alguns Tempo.

    Se uma página no pool não foi alterada desde que foi carregada, ou se foi alterada, mas desde então as alterações foram gravadas de volta no disco e não foram necessárias por um tempo, esse pedaço do pool é prontamente reutilizável para outra coisa na próxima vez que o InnoDB quiser carregar algo de volta no pool a partir do disco ... então está "em uso", mas ainda "disponível".

    A menos que você acesse com frequência todos os 50 GB desses blobs, a recomendação de tamanho do script de ajuste é exagerada. É claro que, em um mundo ideal, seu pool seria maior do que todas as suas tabelas e índices e você teria um banco de dados totalmente em memória que só precisava acessar o disco para liberar as alterações... mundo de dados reais, as chances são muito boas de que uma grande parte de seus dados não seja acessada com frequência e não há como um script simples antecipar essas condições.

    • 3
  2. Best Answer
    Bill Karwin
    2013-10-03T18:46:54+08:002013-10-03T18:46:54+08:00

    O buffer pool do InnoDB armazena cópias de qualquer coisa que esteja armazenada nas páginas do banco de dados no disco. Isso inclui:

    • Data (que é realmente o índice primário clusterizado para cada tabela)
    • índices secundários
    • Blobs/Text/Varchar que não cabem nas páginas de dados
    • Desfazer páginas
    • Alterar páginas de buffer
    • etc.

    Não há como excluir um desses tipos de página. Todos eles ocupam o buffer pool de tempos em tempos, com base na demanda.

    Então, estritamente falando, a única resposta para sua pergunta de como excluir os dados do InnoDB Blob do buffer pool é usar um mecanismo de armazenamento diferente.

    Você também pode excluir as colunas Blob/Text/Varchar de suas consultas. Apenas não faça referência a essas colunas em sua consulta (evite usar SELECT *). O InnoDB é inteligente o suficiente para pular o carregamento de páginas extras de dados Blob/Text/Varchar que ele não precisa.

    Mas você deve aceitar a recomendação de ferramentas como mysqltuner com cautela. Você não precisa necessariamente de tanto buffer pool quanto da quantidade total de dados. Na verdade, é mais comum que você tenha uma regra 80/20: 80% de suas consultas são atendidas por 20% de seus dados.

    Sua milhagem pode variar -- os tipos de consultas que você executa determinam qual é o melhor compromisso no tamanho do buffer pool. Você pode fornecer uma alocação de melhor estimativa e, em seguida, monitorar a proporção de leituras de página lógica versus E/S de página física:

    mysql> show global status like 'innodb_buffer_pool_read%s';
    +----------------------------------+-----------+
    | Variable_name                    | Value     |
    +----------------------------------+-----------+
    | Innodb_buffer_pool_read_requests | 151062817 |
    | Innodb_buffer_pool_reads         | 3585      |
    +----------------------------------+-----------+
    

    Ou a taxa de acesso à página:

    mysql> show engine innodb status\G
    ...
    ----------------------
    BUFFER POOL AND MEMORY
    ----------------------
    ...
    Buffer pool hit rate 999 / 1000, young-making rate 36 / 1000 not 0 / 1000
    ...
    

    Se você não gostar dessas proporções, aloque mais RAM para o buffer pool.

    • 2

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • 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

    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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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