Mysql Advanced (1) Processo e arquitetura de execução do Mysql

Como uma consulta é executada?

select id from student;

A instrução de consulta simples acima consulta o id da tabela student. Então, como o Mysql traduz essa instrução nas instruções necessárias para obter os dados e devolvê-los ao cliente? Aqui está um fluxograma aproximado

imagem-20220713165549179

Em primeiro lugar, os dados são armazenados no lado do servidor Mysql. Aplicativos ou ferramentas são todos clientes. Para ler o banco de dados, o primeiro passo é estabelecer uma conexão e comunicação com o banco de dados. Então, como o cliente e o servidor se comunicam?

carta de acordo

Mysql suporta uma variedade de protocolos de comunicação, incluindo protocolo TCP/IP, protocolo Unix Socket, protocolo Share Memory, protocolo Named Pipes, pode usar modo síncrono/assíncrono e suporta conexão longa/conexão curta

Tipo de comunicação: síncrona ou assíncrona

Sincronizar

1. 同步通信依赖于被调用方,受限于被调用方的性能,也就是是说,应用操作数据库,线程会阻塞,等待数据返回
2. 一般只能做到一对一,很难做到一对多的通信

assíncrono

  1. A assincronia pode evitar o bloqueio e a espera do aplicativo, mas não pode calcular o tempo de execução do SQL.
  2. Se houver simultaneidade na assincronia, cada execução SQL deve estabelecer um link separado para evitar confusão de dados, mas isso trará enorme pressão ao servidor (uma conexão é um thread, e a troca de threads consome muitos recursos da CPU) e assíncrona comunicação Também traz complexidade de codificação (ps: foi recentemente sobrecarregado pelo projeto Node.js da empresa (io assíncrono)), por isso geralmente não é recomendado. Se você usar assíncrono, deverá usar um pool de conexões, enfileirando-se para obter uma conexão do pool de conexões em vez de criar uma conexão

De modo geral, usamos conexão síncrona para conectar-se ao banco de dados.

Modo de conexão: conexão longa ou conexão curta

Mysql suporta conexões longas e conexões curtas. De modo geral, é uma conexão longa e colocará essa conexão longa no pool de conexões do cliente.

No lado do servidor, você pode usar o comando show status para ver quantas conexões o Mysql possui atualmente

show global status like 'Thread%'

imagem-20220713172916527

Cada vez que uma conexão ou sessão é gerada, um thread será criado no lado do servidor para lidar com isso.

campo significado
Threads_cached Número de conexões encadeadas no cache
Threads_conectados número atual de conexões abertas
Threads_criados Número de threads criados para lidar com conexões
Threads_running O número de conexões em estado não adormecido geralmente se refere ao número de conexões simultâneas

Manter uma conexão longa consumirá memória. Se a conexão ficar inativa por um longo período, o servidor Mysql será desconectado automaticamente. O tempo padrão é 8 horas e 28.800 segundos

show global variables like 'wait_timeout' --非交互式超时时间,如JDBC程序
show global variables like 'interactive_timeout' --交互式超时时间,如数据库工具navicat

imagem-20220713174022203

O número máximo de conexões permitidas pelo serviço Mysql é 15 por padrão e o máximo pode ser definido como 10.000.

show variables like 'max_connections'

imagem-20220713183251988

**Descrição do nível de parâmetro: **Os parâmetros no MySQL são divididos em níveis de sessão e globais, que são efetivos na sessão atual e globalmente, mas nem todo parâmetro possui dois níveis. Por exemplo, max_connections possui apenas um nível global. Quando não há parâmetro, o padrão é o nível da sessão, incluindo consulta e modificação. Por exemplo, após modificar um parâmetro, a consulta entrou em vigor nesta janela, mas não entra em vigor em outras janelas. Esta é a maneira comum para enviar transações de modificação

show variables like 'autocommit';
set autocommit = on; --默认为session级别,只在当前窗口有效

carta de acordo

  1. Protocolo TCP/IP

Normalmente nos conectamos ao MySQL através deste protocolo, e várias linguagens de programação importantes implementam módulos de conexão de acordo com este protocolo.mysql -h xx.xx.xx.xx -u root -p

  1. Protocolo de soquete Unix

Normalmente usamos este protocolo para efetuar login no servidor MySQL, porque um arquivo físico é necessário para conectar-se ao MySQL usando este protocolo. O local de armazenamento do arquivo é definido no arquivo de configuração. O endereço padrão é /var/lib/mysql /mysql.sock, que vale a pena mencionar. Surpreendentemente, este é o mais eficiente de todos os protocolos.

  1. Protocolo de compartilhamento de memória

A maioria das pessoas não conhece este protocolo e definitivamente não é usado, porque só pode ser usado pelo Windows. Para usar este protocolo, você precisa usar o parâmetro –shared-memory no arquivo de configuração na inicialização. Observe que, usando este protocolo, apenas Pode haver um servidor, então essa coisa geralmente é inútil, a menos que você suspeite que outros protocolos não podem funcionar normalmente.Na verdade, o SQL Server da Microsoft também suporta este protocolo.

  1. Protocolo de Pipes Nomeados

Este protocolo só pode ser usado por windows. Assim como a memória compartilhada, usando este protocolo, só pode haver um servidor em um host, mesmo que sejam usadas portas diferentes. Named Pipes é um protocolo desenvolvido para LAN. Uma parte da memória é usada por um processo para passar informações para outro processo, de modo que a saída de um processo é a entrada de outro processo. O segundo processo pode ser local (no mesmo computador que o primeiro processo) ou remoto (em um computador em rede). Por causa disso, se não houver ou estiver desativado um ambiente TCP/IP em seu ambiente e for um servidor Windows, seu banco de dados ainda poderá funcionar de qualquer maneira. Para usar este protocolo, você precisa adicionar a opção --enable-named-pipe na inicialização

forma de comunicação

  • **Simplex:** Quando dois computadores se comunicam, a transmissão de dados é unidirecional, semelhante a um controle remoto
  • **Half-duplex:** Entre dois computadores, a transmissão de dados é bidirecional, você pode enviar para mim e eu também posso enviar para você, mas nesta conexão de comunicação, apenas um servidor pode se comunicar ao mesmo tempo . Enviar dados, ou seja, os dados não podem ser enviados ao mesmo tempo. Preciso esperar pelos dados que você me enviou antes de poder continuar a enviar os dados. É análogo ao walkie-talkie da vida.
  • **Full duplex: **A transmissão de dados é bidirecional e pode ser transmitida ao mesmo tempo, de forma análoga às chamadas de celular

Mysql usa um método de comunicação half-duplex . Em uma conexão, ou o cliente envia dados para o servidor, ou o servidor envia dados para o cliente. Essas duas ações não podem ocorrer ao mesmo tempo, então o cliente envia instruções SQL para o servidor No final, (em uma conexão) os dados não podem ser divididos em pequenos pedaços para transmissão, não importa o tamanho da instrução sql, ela é enviada de uma só vez. Se a instrução for muito longa em uma consulta, o processo de consulta pode causar problemas, neste momento max_allowed_packeto valor do parâmetro de configuração do servidor MySQL deve ser ajustado e, se for aumentado, será relatado um erro.

imagem-20220816152100900

Por outro lado, para o servidor, todos os dados são enviados de uma só vez, e a operação não pode ser interrompida só porque você obteve os dados desejados, o que consumirá muita rede e memória neste momento. Portanto, no programa, é necessário evitar tais operações sem limite. Por exemplo, para descobrir todos os dados que atendem às condições de uma só vez, eles devem ser contados primeiro. Se a quantidade de dados for grande, pode ser consultados em lotes.

cache de consulta

Ele foi removido do mysql8.0 e não é recomendado para uso.Recomenda-se entregar o cache a um servidor de cache independente para operação.

Análise gramatical lexical e pré-processamento (analisador, pré-processador)

Quando a consulta mysql insere algumas instruções de consulta erradas, o servidor relatará um erro 1064, então como o mysql sabe que o conteúdo de entrada está errado? Isso é feito principalmente pelo analisador Parser do Mysql e pelo módulo de pré-processamento Preprocessor

imagem-20220816153102331

Por exemplo, uma instrução de consulta simples select name from user where id = 1será dividida em 8 símbolos, incluindo "=". Em seguida, a análise gramatical fará algumas verificações gramaticais na instrução SQL, como se as aspas estão fechadas, etc. Após a conclusão da análise lexical e gramatical, o Mysql analisará a instrução SQL em uma nova estrutura de dados de acordo com a gramática definida. regras. Usaremos esta estrutura de dados chamada árvore de análise (select_lex)

imagem-20220829162352256

Se uma sintaxe lexical for SQL correta, mas o nome da tabela ou do campo não existir, ao analisar a instrução SQL, o pré-processador verificará a árvore de análise gerada para resolver a semântica que o analisador não pode analisar, por exemplo, verificará o Existência de nomes de tabelas e colunas, verifique o nome e o alias, certifique-se de que não haja ambiguidade

Otimizador de consultas e plano de execução de consultas

O que é um otimizador

A árvore de análise é uma estrutura de dados que pode ser reconhecida pelo executor. Uma instrução SQL possui apenas um método de execução? Ou o SQL finalmente executado pelo banco de dados é igual ao SQL enviado? A resposta é não, uma instrução SQL pode ser executada de várias maneiras e, em última análise, retornar o mesmo resultado, elas são equivalentes. Mas se existem tantos métodos de execução, como esses métodos de execução são obtidos? Qual escolher no final? E por quais critérios você escolhe?

Este é o módulo otimizador de consulta MYSQL (Optimizer).

O objetivo do otimizador de consulta é gerar diferentes planos de execução (Plano de Execução) de acordo com a árvore de análise e, em seguida, selecionar um plano de execução ideal. O MySQL usa um otimizador baseado em custos. Qual plano de execução tem o menor custo? Basta usar o que for.

-- 可以使用这个命令查看查询的开销
show status like "Last_query_cost"

o que um otimizador pode fazer

Quais tipos de otimização o otimizador do MySQL pode manipular? Dê dois exemplos simples:

  1. Quando realizamos uma consulta associada em várias tabelas, quais dados da tabela são usados ​​como tabela de referência (qual tabela é acessada primeiro).
  2. Qual índice escolher quando houver vários índices disponíveis.
  3. Para a otimização das condições de consulta, como remoção de identidades como 1 = 1, remoção de parênteses desnecessários, cálculo de expressões, otimização de subconsultas e consultas de junção.

Então, qual é o resultado após ser processado pelo otimizador e como o MySQL lida com isso?

Resultado da execução do otimizador

O otimizador acabará por transformar a árvore de análise em um plano de execução (execution_plans), que também é uma estrutura de dados.Claro, esse plano de execução não é necessariamente o plano de execução ideal, porque o MySQL pode não cobrir todos os planos de execução. Podemos visualizar as informações do plano de execução adicionando EXPLAIN na frente da instrução SQL. A chave é o índice utilizado, se quiser obter informações detalhadas, você também pode usarFORMAT = JSON

 explain select name from user_innodb where id = 1;
 explain format = json select name from user_innodb where id = 1;

imagem-20220830163130696

mecanismo de armazenamento

introdução básica

Ao armazenar dados na tabela, também é necessário organizar a estrutura de armazenamento dos dados, que é determinada pelo nosso mecanismo de armazenamento. No MySQL, cada tabela que criamos pode especificar seu mecanismo de armazenamento, em vez de um banco de dados só pode usar um mecanismo de armazenamento, o mecanismo de armazenamento é usado em unidades de tabelas, também podemos chamar o mecanismo de armazenamento de tipo de tabela, e o mecanismo de armazenamento pode ser modificado após a criação.

Visualize os mecanismos de armazenamento das tabelas existentes no banco de dados

show table status from <db>

imagem-20220830172318269

Por padrão, cada banco de dados possui uma pasta e qualquer mecanismo de armazenamento possui um arquivo frm, que é um arquivo de definição de estrutura de tabela. Diferentes mecanismos de armazenamento armazenam dados de maneiras diferentes e geram arquivos diferentes. O mecanismo de armazenamento innodb é um arquivo que termina com ibd, o mecanismo de armazenamento de memória não e o mecanismo de armazenamento myisam contém dois arquivos, um termina com MYD e o outro termina com MYI.

Diretório do arquivo de dados do banco de dados

 show variables like 'datadir';
-- 默认目录为/var/lib/mysql

Comparação de mecanismos de armazenamento

Podemos usar este comando para verificar o suporte do banco de dados para o mecanismo de armazenamento

show engines;

imagem-20220830180723914

Há uma descrição do mecanismo de armazenamento e suporte para transações, protocolo XA e pontos de salvamento. O protocolo XA é usado para implementar transações distribuídas (divididas em gerenciadores de recursos locais e gerenciadores de transações). Savepoints são usados ​​para implementar subtransações (transações aninhadas). Depois de criar um Savepoints, a transação pode ser revertida até este ponto sem afetar as operações anteriores à criação dos Savepoints

  • MeuISAM

    O mecanismo de armazenamento que acompanha o MySQL é atualizado a partir do ISAM. O documento do site oficial https://dev.mysql.com/doc/refman/8.0/en/myisam-storage-engine.html, o escopo de aplicação é relativamente pequeno, o bloqueio em nível de tabela limita o desempenho de leitura/gravação, portanto, na Web e no data warehouse Na configuração, geralmente é usado para trabalho somente leitura ou principalmente leitura

  • InnoDB

    O mecanismo de armazenamento padrão após MySQL 5.7 é adequado para tabelas que são atualizadas frequentemente, e há leituras e gravações simultâneas ou sistemas de negócios com processamento de transações.InnoDB é um mecanismo de armazenamento MySQL seguro para transações (compatível com ACID) que possui commit, rollback, e recuperação de falhas. recursos para proteger os dados do usuário, bloqueios em nível de linha do InnoDB (não atualizados para bloqueios de granulação mais grossa) e leituras consistentes no estilo Oracle melhoram a simultaneidade e o desempenho multiusuário; as tabelas do InnoDB organizam os dados no disco para otimizar consultas com base em dados primários. keys , cada tabela do InnoDB possui um índice de chave primária chamado índice clusterizado, que organiza os dados para minimizar E/S para pesquisas de chave primária; para garantir a integridade dos dados, o InnoDB suporta restrições FOREIGN KEY, que usam chaves estrangeiras para verificar inserções, atualizações e Delete para garantir que não causem inconsistências entre tabelas relacionadas. Documentação do site oficial https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html

    características

    1. Suporta transações e chaves estrangeiras, para que a integridade e a consistência dos dados sejam maiores.
    2. Suporta bloqueios em nível de linha e bloqueios em nível de tabela.
    3. Suporta simultaneidade de leitura e gravação, gravação sem bloqueio de leitura (MVCC).
    4. O método especial de armazenamento de índice pode reduzir IO e melhorar a eficiência da consulta.
  • Memória

    Armazene todos os dados na RAM para acesso rápido em um ambiente que precisa encontrar rapidamente dados não críticos.Coloque os dados na memória e a velocidade de leitura e gravação é muito rápida, mas se o banco de dados reiniciar ou travar, todos os dados serão desaparecer.É adequado apenas para fazer tabela temporária, que armazena os dados da tabela na memória, usa índice hash por padrão.

  • CSV (3 arquivos)

    Suas tabelas são, na verdade, arquivos de texto com valores separados por vírgula. As tabelas CSV permitem que os dados sejam importados ou despejados no formato CSV para troca de dados com scripts e aplicativos que leem e gravam no mesmo formato. Como as tabelas CSV não têm índices, elas geralmente estão em Mantenha os dados nas tabelas Innodb durante a operação normal e use apenas tabelas CSV durante a fase de importação ou exportação.

    Recursos: Linhas em branco não são permitidas e índices não são suportados. O formato é comum e pode ser editado diretamente, adequado para importação e exportação entre diferentes bancos de dados

  • Arquivo (2 arquivos)

    Essas tabelas compactas e não indexadas são usadas para armazenar e recuperar grandes quantidades de informações históricas, de arquivo ou de auditoria de segurança raramente referenciadas.

    **Recursos:** Não suporta índice, não suporta exclusão de atualização.

Diferentes mecanismos de armazenamento fornecem recursos diferentes, possuem diferentes mecanismos de armazenamento, métodos de indexação, níveis de bloqueio e outras funções.

Em diferentes cenários de negócios, podemos escolher diferentes mecanismos de armazenamento para atender às nossas necessidades dependendo dos requisitos do banco de dados.É por isso que o MySQL suporta tantos mecanismos de armazenamento.

Como escolher um mecanismo de armazenamento

Se você tiver altos requisitos de consistência de dados e precisar oferecer suporte a transações, poderá escolher o InnoDB.

Se houver mais consultas de dados e menos atualizações, e os requisitos de desempenho da consulta forem relativamente altos, você poderá escolher MyISAM.

Se precisar de uma tabela temporária para consulta, você pode escolher Memória.

Se todos os mecanismos de armazenamento não atenderem aos requisitos, você poderá desenvolver um mecanismo de armazenamento no manual interno do site oficial

Como uma atualização SQL é executada?

Qual é a diferença entre o processo de atualização e o processo de consulta? O processo básico é o mesmo, ou seja, também precisa ser processado pelo analisador, pelo otimizador e finalmente entregue ao executor. A diferença está na operação após obter os dados qualificados

conjunto de buffers

Em primeiro lugar, para o Innodb, os dados são colocados no disco. Para operar os dados, o mecanismo de armazenamento deve primeiro carregar os dados do disco na memória antes de poder operar.

Há uma questão aqui: quantos dados carregamos do disco para a memória por vez, levamos quantos precisamos? Em comparação com as operações de memória, as operações de E/S do disco são bastante demoradas. Se os dados de que precisamos forem distribuídos em diferentes locais do disco, isso significa que muitas operações de E/S serão geradas.

Portanto, tanto o sistema operacional quanto o mecanismo de armazenamento possuem um conceito de pré-leitura. Quando um dado no disco é lido, é muito provável que o local próximo a ele também seja lido imediatamente. Isso é chamado de Princípio da localidade . Dessa forma, simplesmente lemos mais dados cada vez que lemos, em vez de ler o quanto precisamos.

O InnoDB define uma unidade mínima para leitura de dados do disco para a memória, chamada página, que é semelhante à página do sistema operacional. O tamanho da página do sistema operacional é geralmente 4K, enquanto no InnoDB o tamanho da página é 16Kb, o que é uma unidade lógica, se você precisar modificar o tamanho deste valor, será necessário modificar o código-fonte, recompilar e instalar.

Imagine que para a operação da página de dados, o disco é operado diretamente todas as vezes e carregado do disco para a memória. Isso será lento? Essas páginas podem ser armazenadas em cache para acelerar o carregamento de dados.

O InnoDB usa uma tecnologia de buffer pool, ou seja, coloca a página lida do disco em uma área de memória. Na próxima vez que você ler a mesma página, primeiro determine se ela está nesta área de memória. Em caso afirmativo, leia-a diretamente. , e então opere sem carregar do disco novamente, esta área de memória é chamada Buffer Pool

Ao modificar dados, primeiro modifique as páginas no buffer pool de memória. Quando as páginas de dados na memória são inconsistentes com os dados do disco, nós as chamamos de páginas sujas. Quando as páginas sujas serão sincronizadas com o disco?

InnoDB tem um histórico especial para gravar os dados do Buffer Pool no disco e gravar múltiplas modificações no disco ao mesmo tempo, de vez em quando. Esta ação é chamada de sujar

Estrutura de memória InnoDB e estrutura de disco

imagem-20230506170646449

A estrutura de memória inclui principalmente Buffer Pool, Change Buffer, Log Buffer AHI.

  1. Conjunto de buffers

    As informações da página são armazenadas em cache no Buffer Pool. O tamanho padrão é 128M, que pode ser modificado e ajustado.

  2. (refazer) Buffer de registro

    Como a liberação não é em tempo real, se as páginas sujas no BufferPool não tiverem sido liberadas para o disco, o banco de dados ficará inativo ou reiniciado e os dados serão perdidos. Os dados na memória devem ter uma medida persistente. Para evitar esse problema, o InnoDB grava todas as operações de modificação de página em um arquivo de log. Se houver dados que não foram sincronizados com o disco, o banco de dados se recuperará desse arquivo de log quando for iniciado (para obter segurança contra falhas). transação da qual estamos falando O D (persistência) no ACID é implementado com ela.

    Este arquivo de log é o redo log do disco (chamado redo log), que corresponde a ib_logfile0 e ib_logfile1 no diretório /var/lib/mysql/. Existem dois arquivos por padrão, cada um com 48M.show variables like 'innodb_log'

    1. Ele também é gravado no disco, por que não gravar diretamente no arquivo db, mas primeiro gravar o log e depois gravar no disco? Qual é a diferença entre gravar um arquivo de log e gravar em um arquivo de dados?

      Os dados estão espalhados em diferentes setores e a gravação no arquivo db requer uma operação de disco, que é E/S aleatória, enquanto o registro é E/S sequencial (gravado continuamente) e E/S sequencial é mais eficiente, então escrever o a modificação no arquivo de log pode atrasar o tempo de liberação do disco e, ao mesmo tempo, garantir a segurança dos dados da memória, melhorando assim o rendimento do sistema.

    Características:

    1. O redo log é implementado pelo mecanismo de armazenamento InnoDB, nem todos os mecanismos de armazenamento o possuem, o suporte para recuperação de falhas é um recurso do InnoDB.
    2. Redo log é um log físico que registra "quais modificações foram feitas em uma determinada página de dados"
    3. O tamanho do redo log é fixo e o conteúdo anterior será sobrescrito.Quando estiver cheio, ele irá acionar a sincronização do buffer pool com o disco para liberar espaço para modificações subsequentes.
  3. desfazer log do espaço de tabela

    O log de desfazer (log de desfazer ou log de reversão) registra o estado dos dados (excluindo a seleção) antes que a transação ocorra. Se ocorrer uma exceção ao modificar os dados, o log de desfazer pode ser usado para implementar a operação de reversão (para manter a atomicidade).

    Ao executar o desfazer, ele apenas restaura logicamente os dados para o estado anterior à transação, em vez de operar na página física. Ele pertence ao formato lógico do log. Os dados do log de desfazer estão no arquivo Ibdata1 do espaço de tabela do sistema por padrão , porque o arco e a flecha da tabela compartilhada não serão reduzidos automaticamente e um espaço de tabela de desfazer também pode ser criado separadamente.

Com esses logs, vamos resumir o fluxo de uma operação de atualização. Por exemploupdate user set name = 'telangpu' where name = "baideng";

  1. Quando a transação é iniciada, a memória (buffer pool) ou disco (arquivo de dados) busca esses dados e os retorna ao executor do servidor;
  2. O executor do servidor modifica o valor desta linha de dados para telangpu;
  3. Record name=baideng para desfazer log;
  4. Nome do registro=telangpu para refazer log
  5. Chame a interface do mecanismo de armazenamento para modificar os dados no pool de buffers de memória
  6. confirmação de transação

O thread de segundo plano funciona, atualiza os dados no pool de memória e atualiza os dados modificados no disco.

Log binário

Para lidar com os arquivos de log da arquitetura Innodb, a camada Servidor do Mysql também possui um arquivo de log chamado binlog, que pode ser utilizado por todos os mecanismos de armazenamento.

O binlog registra todas as instruções DDL e DML na forma de eventos. Ele registra operações em vez de dados. O binlog pode ser usado para replicação mestre-escravo e recuperação de dados. Ao contrário dos logs de redo log, os arquivos de log do binlog podem ser anexados. Não há tamanho fixo. limite.

Quando a função binlog está ativada, podemos exportar o binlog para instruções SQL e reexecutar todas as operações para obter a recuperação de dados (arquivo).

Acho que você gosta

Origin blog.csdn.net/Hong_pro/article/details/130533081
Recomendado
Clasificación