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 / 18663
Accepted
Alan
Alan
Asked: 2012-06-01 17:33:17 +0800 CST2012-06-01 17:33:17 +0800 CST 2012-06-01 17:33:17 +0800 CST

Gravação aleatória congela

  • 772

Eu tenho um banco de dados MySQL 5.5.23 que executa cerca de 3k qps, 5% dos quais são gravações. Ultimamente, tenho tido um grande problema com congelamentos aleatórios de gravação. Tudo está indo muito bem e, de repente, qualquer gravação que chega pára no estado "atualizar" ou "Atualizando". Eles ficam nesse estado por cerca de um ou dois minutos e finalmente terminam. O problema é que com uma quantidade tão grande de conexões, quando elas congelam aleatoriamente assim, a conexão permanece aberta e inevitavelmente recebo muitos erros de conexão.

Está acontecendo em todas as tabelas durante as consultas INSERT e UPDATE.

Alguém viu isso antes? Existe algo que possa ser feito sobre isso?

Estou usando o Amazon RDS com a maior instância que eles oferecem. Terei o maior prazer em fornecer qualquer informação que vocês precisem, apenas deixe-me saber o que é.

ATUALIZAÇÃO: A tabela principal que estou inserindo é:

CREATE TABLE `mytable` (
 `hash` varchar(5) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
 `name` varchar(256) DEFAULT NULL,
 `ip` varchar(64) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
 `deletehash` char(15) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
 `datetime` datetime NOT NULL,
 `api_key` varchar(64) CHARACTER SET latin1 COLLATE latin1_general_cs DEFAULT NULL,
 `account_id` int(10) unsigned DEFAULT NULL,
 `type` varchar(15) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
 `width` int(10) unsigned NOT NULL DEFAULT '0',
 `height` int(10) unsigned NOT NULL DEFAULT '0',
 `size` int(10) unsigned NOT NULL DEFAULT '0',
 `animated` tinyint(1) NOT NULL DEFAULT '0',
 `views` int(10) unsigned NOT NULL DEFAULT '0',
 `lastviewed` datetime NOT NULL,
 PRIMARY KEY (`hash`),
 UNIQUE KEY `deletehash` (`deletehash`),
 KEY `datetime` (`datetime`),
 KEY `account_id` (`account_id`),
 KEY `ip` (`ip`),
 KEY `api_key` (`api_key`),
 KEY `views` (`views`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

Inserção de amostra:

insert into mytable (hash, name, ip, deletehashe, datetime, api_key, account_id, type, width, height, size, animated, views, lastviewed) values('abcde', 'file name', '127.0.0.1', 'abcdefghijklmn', '2012-05-31 00:00:00', NULL, NULL, 'mime/type', 0, 0, 0, 0, 0, '0000-00-00 00:00:00');

Exemplo de atualização:

update mytable set views = views+1, lastviewed = NOW() where hash = 'abcde';

"Atualizando"

mysql amazon-rds
  • 1 1 respostas
  • 832 Views

1 respostas

  • Voted
  1. Best Answer
    ypercubeᵀᴹ
    2012-06-02T10:23:25+08:002012-06-02T10:23:25+08:00

    Acho que o problema se deve à escolha do índice clusterizado. Dos documentos do MySQL, índices clusterizados e secundários :

    Cada tabela InnoDB possui um índice especial chamado índice clusterizado, onde os dados das linhas são armazenados. Normalmente, o índice clusterizado é sinônimo da chave primária. Para obter o melhor desempenho de consultas, inserções e outras operações de banco de dados, você deve entender como o InnoDB usa o índice clusterizado para otimizar as operações de pesquisa e DML mais comuns para cada tabela.


    Verifique também a resposta de @marc_s nesta pergunta do SO: Como escolher o índice clusterizado no SQL Server? , onde menciona:

    De acordo com a Rainha da Indexação - Kimberly Tripp - o que ela procura em um índice agrupado é principalmente:

    • Único
    • Estreito
    • Estático

    E se você também pode garantir:

    • Padrão cada vez maior

    então você está bem perto de ter sua chave de agrupamento ideal!


    Agora, seu índice clusterizado é a (chave primária):

    hash varchar(5) CHARACTER SET latin1 COLLATE latin1_general_cs NOT NULL,
    

    que (vamos ver a lista de verificação) é:

    • Único (sim, OK)
    • Estreito (sim, OK)
    • Estático (talvez, você sabe disso)

    mas provavelmente não é:

    • Padrão cada vez maior (Não, provavelmente não é)

    Então, o que acontece quando você usa um índice clusterizado não crescente?

    Eu não posso responder melhor do que Kimberly L. Trip : Chave de agrupamento cada vez maior - o Debate do Índice Clusterizado........novamente!

    Se a chave de agrupamento for sempre crescente, as novas linhas terão um local específico onde podem ser colocadas. Se esse local estiver no final da tabela, a nova linha precisará de espaço alocado para ela, mas não precisará abrir espaço no meio da tabela. Se uma linha for inserida em um local que não possui espaço, será necessário criar espaço(por exemplo, você insere com base no sobrenome, então, conforme as linhas vêm no espaço, será necessário fazer onde esse nome deve ser colocado). Se for necessário abrir espaço, ele será feito pelo SQL Server fazendo algo chamado divisão. As divisões no SQL Server são divisões 50/50 - simplesmente - 50% dos dados permanecem e 50% dos dados são movidos. Isso mantém o índice logicamente intacto (o nível mais baixo de um índice - chamado de nível folha - é uma lista duplamente vinculada), mas não fisicamente intacto. Quando um índice tem muitas divisões, diz-se que o índice está fragmentado. Bons exemplos de um índice que está sempre aumentando são as colunas IDENTITY (e elas também são naturalmente únicas, estáticas e naturalmente estreitas) ou algo que segue o máximo possível dessas coisas - como uma coluna de data e hora (ou já que NÃO é muito provável que seja único por si só datetime, identity).

    Observe que, apesar da menção do SQL-Server, o mesmo conceito também se aplica aos índices clusterizados do InnoDB. Suponho que o índice clusterizado tenha 2 problemas:

    • Quando você está inserindo uma nova linha (o hash "aleatório" garante isso), ela é inserida em um local aleatório do índice. Isso significa que às vezes não encontrará espaço disponível para ser inserido (observe que o InnoDB sempre deixa algum espaço livre no índice, mas quando esse espaço livre disponível é preenchido) deve haver algum rearranjo do índice - e isso leva tempo .

    • O que o rearranjo também está causando ao longo do tempo é a fragmentação do índice. O que eventualmente tornará outras consultas e declarações mais lentas.

    • 4

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 ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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