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 / 10840
Accepted
Dolan Antenucci
Dolan Antenucci
Asked: 2012-01-18 14:39:56 +0800 CST2012-01-18 14:39:56 +0800 CST 2012-01-18 14:39:56 +0800 CST

Como posso otimizar minha configuração do mysql para criar meu índice mais rapidamente?

  • 772

Eu tenho um servidor rodando Ubuntu 10.04 com Mysql 5.1x instalado via pacote. O sistema tem 128 GB de RAM, 8 núcleos e 4 TB de espaço livre onde Mysql e Mysql tmp são armazenados.

Eu tenho um MyISAM assim:

CREATE TABLE `data_store` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `uniqname` varchar(150) NOT NULL,
  `data` blob,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM CHARSET=latin1;

Eu inseri 800mil registros (cerca de 350gb de dados antes de inserir), então tentei adicionar o seguinte índice:

ALTER TABLE data_store DISABLE KEYS;
ALTER TABLE data_store ADD INDEX uniqname_index (uniqname);
ALTER TABLE data_store ENABLE KEYS;

(Em relação ao DISABLE KEYScomando, vi que sugerido em outro lugar para usar ANTES de inserir dados e, como o comando nunca chegou a ENABLE KEYS, presumo que não esteja servindo a nenhum propósito para mim. Acabei de incluir principalmente para ser completo em minha descrição do que estou estou fazendo.)

Quando inicio o trabalho de indexação, o primeiro status que aparece SHOW PROCESSLISTé "copiando para a tabela tmp".

Depois de algumas horas, volto a verificar e o status permanece na mensagem "Reparar com Keycache" mesmo após 24 horas. Tentei executar o trabalho em um servidor um pouco mais antigo e, após 3 dias, ele ainda permanece com o status "Reparar com cache de chave". Por causa disso, cancelei o comando create-index nesta máquina mais nova.

Eu li que o "Reparar com Keycache" pode ser muito lento e "Reparar por classificação" é o preferido em muitos casos.

Com base em alguns Stack Exchange e postagens aleatórias online, adicionei as seguintes configurações ao meu servidor Mysql:

myisam_sort_buffer_size = 80G
bulk_insert_buffer_size = 80G
myisam_repair_threads   = 8
max_heap_table_size     = 20G
myisam_max_sort_file_size = 500G
tmp_table_size          = 20G
key_buffer_size         = 20G
sort_buffer_size        = 20G
join_buffer_size        = 20G

Reiniciei o trabalho e o mesmo processo aconteceu novamente (copie para o arquivo tmp e repare por meio do cache de chaves).

Depois de matar o trabalho, notei que em mysql/error.log havia uma mensagem, "myisam_sort_buffer_size é muito pequeno". Isso aconteceu no início do dia e não exatamente quando eu matei o trabalho.

perguntas

  • Estou indo pelo caminho errado? Eu só quero poder pesquisar meus dados rapidamente por alguma chave (uniqname).

  • Existe algum benefício em começar de novo com minha tabela, adicionar o índice desde o início, usar o DISABLE KEYScomando, inserir meus registros de 800mil e depois ENABLE KEYS? Eu li em outro lugar que isso pode impedir a cópia da tabela tmp (o que pode me poupar apenas algumas horas?)

  • Eu quero este 'Reparar por triagem'?

mysql index
  • 1 1 respostas
  • 9778 Views

1 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-01-18T15:53:12+08:002012-01-18T15:53:12+08:00

    Para começar, eu não tocaria nos tamanhos dos buffers ainda. Os tamanhos que você tem na pergunta são monstruosamente grandes demais.

    Aqui está outra observação: você tem dados BLOB. Ai, sua mesa temporária vai ocupar espaço rapidamente. Você poderia fazer algo assim:

    Crie um disco RAM de 32 GB chamado /var/tmpfs adicionando esta linha a /etc/fstab

    none                    /var/tmpfs              tmpfs   defaults,size=32g        1 2
    

    Em seguida, crie uma pasta chamada /mysqltmp e monte o disco RAM nela

    mkdir /mysqltmp
    chown mysql:mysql /mysqltmp
    mount /mysqltmp /var/tmpfs
    

    Adicione isso ao my.cnf e reinicie o mysql

    [mysqld]
    tmpdir=/mysqltmp
    

    Agora, qualquer tabela tmp feita via DDL vai parar no disco RAM.

    Aqui está mais uma observação: Por que não criar uma tabela separada que mantenha os dados BLOB longe dos nomes exclusivos?

    CREATE TABLE `data_store_name` SELECT id,uniqname FROM `data_store` WHERE 1=2;
    ALTER TABLE `data_store_name` ADD PRIMARY KEY (id);
    ALTER TABLE `data_store_name` ADD UNIQUE KEY (uniqname);
    ALTER TABLE `data_store_name` ADD INDEX name_id_ndx (uniqname,id);
    INSERT INTO `data_store_name` SELECT id,uniqname FROM `data_store`;
    

    Isso evitará qualquer movimentação de dados BLOB durante a indexação.

    A partir daqui, você sempre teria que ingressar no data_store usando seu nome assim:

    SELECT
        A.uniqname,B.data
    FROM
        (SELECT * FROM data_store_name WHERE uniqname = 'mydataname') A
        LEFT JOIN
        data_store B USING (id)
    ;
    

    Fazer essas alterações evitará toda essa confusão de lidar com cache de chaves, discos de RAM e tabelas tmp.

    De uma chance !!!

    • 6

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