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 / 5974
Accepted
Rick James
Rick James
Asked: 2011-09-21 00:57:11 +0800 CST2011-09-21 00:57:11 +0800 CST 2011-09-21 00:57:11 +0800 CST

O melhor de MyISAM e InnoDB

  • 772

É possível fazer o InnoDB usar índices iguais aos do MyISAM em vez do índice clusterizado devido à limitação da RAM enquanto obtém o benefício de seu desempenho de simultaneidade?

mysql performance
  • 3 3 respostas
  • 18130 Views

3 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-09-21T10:39:06+08:002011-09-21T10:39:06+08:00

    O gen_clust_index (índice agrupado) sob o capô do InnoDB abriga entradas de chaves primárias junto com rowids. O que é interessante sobre o uso do gen_clust_index é o fato de que quaisquer índices não exclusivos que você criar sempre terão um rowid correspondente para o gen_clust_index de uma tabela. Portanto, sempre há pesquisas de índice duplo, uma para o índice secundário e outra para o gen_clust_index.

    Qualquer tentativa de melhorar o layout de uma tabela ou chave primária é anulada por causa do gen_clust_index, ou pelo menos resultados marginais na melhor das hipóteses.

    EXEMPLO

    Algumas pessoas tentam classificar um MyISAM na ordem PRIMARY KEY. De acordo com MySQL Database Design and Tuning, página 236, parágrafo 7, sob o subtítulo "Storing a Table in Index Order":

    Se você frequentemente recupera grandes intervalos de dados indexados de uma tabela ou classifica consistentemente os resultados na mesma chave de índice, talvez queira considerar a execução de myisamchk com a opção --sort-records. Fazer isso diz ao MySQL para classificar os dados da tabela na mesma ordem física do índice e pode ajudar a acelerar esses tipos de operações. Como alternativa, você pode combinar a instrução ALTER TABLE com uma opção ORDER BY de uma coluna específica para obter os mesmos resultados.

    Concedido, isso funciona e funciona efetivamente PARA MyISAM . Você pode executar ALTER TABLE ... ORDER BY col1,col2,...,coln no InnoDB, onde as colunas podem ou não ser as da PRIMARY KEY. Isso não produzirá resultados mais rápidos para o InnoDB porque ... isso mesmo ... você deve consultar o gen_clust_index a cada vez.

    Algumas pessoas podem fazer o formato de linha da tabela FIXED usando ALTER TABLE mydb.mytb ROW_FORMAT=Fixed;e podem obter um aumento de 20% no desempenho de leitura sem nenhuma outra alteração. Isso funciona e funciona efetivamente PARA MyISAM . Isso não produzirá resultados mais rápidos para o InnoDB porque ... isso mesmo ... você deve consultar o gen_clust_index a cada vez.

    Você pode executar o seguinte em uma tabela InnoDB chamada mydb.mytb:

    CREATE TABLE mydb.mytc LIKE mydb.mytb;
    INSERT INTO mydb.mytc SELECT * FROM mydb.mytb ORDER BY col1,col2,...coln;
    ALTER TABLE mydb.mytb RENAME mydb.mytd;
    ALTER TABLE mydb.mytc RENAME mydb.mytb;
    DROP TABLE mydb.mytd;
    

    Isso colocará a tabela em ordem de rowid no gen_clust_index. Isso pode produzir resultados marginais para o InnoDB, na melhor das hipóteses, porque... isso mesmo... você deve consultar o gen_clust_index toda vez.

    Agora, vamos ser um pouco ridículos. Existe uma interface NoSQL para consultar (somente SELECT) MyISAM e InnoDB chamada interface HandlerSocket (anteriormente chamada de HANLDER) . Isso fornece acesso a dados que permitem ignorar todos os protocolos SQL, ACID e MVCC . Embora seja possível, IMHO MUITO COMPLICADO PARA CODIFICAR E MANTER. AFAIK, não há nada impresso informando se a interface HandlerSocket interage com o gen_clust_index ou não.

    Em resumo, existem muitas maneiras de esfolar um gato. Nesse caso, você não pode obter o gato (o gen_clust_index). Acho que é por isso que o MyISAM continua a existir por seu desempenho de leitura, sua flexibilidade na ordenação de tabelas, formato de linha de tabela e as ferramentas de suporte a ele. O InnoDB permanecerá projetado em torno de sua natureza compatível com ACID até que alguma alma corajosa pegue o código-fonte do InnoDB e o transforme em algo que tenha o melhor do MyISAM e do InnoDB .

    • 14
  2. Derek Downey
    2011-09-21T05:50:48+08:002011-09-21T05:50:48+08:00

    O índice clusterizado talvez seja o motivo do desempenho de simultaneidade do InnoDB em unidades de rotação tradicionais.

    O acesso a uma linha por meio do índice clusterizado é rápido porque os dados da linha estão na mesma página para onde a pesquisa de índice leva. Se uma tabela for grande, a arquitetura de índice clusterizado geralmente salva uma operação de E/S de disco quando comparada a organizações de armazenamento que armazenam dados de linha usando uma página diferente do registro de índice. (Por exemplo, MyISAM usa um arquivo para linhas de dados e outro para registros de índice.)

    A E/S de disco é cara. Portanto, reduzir isso é um grande benefício para melhorar a simultaneidade.

    Se a E/S de disco começar a ficar mais barata e menos gargalo (por exemplo, à medida que a tecnologia SSD se torna mais estável), a Oracle pode decidir mudar a forma como os índices InnoDB funcionam. É mais provável que permaneça o mesmo, porque a mesma tecnologia fará com que a 'limitação da RAM' seja menos problemática.

    • 3
  3. Morgan Tocker
    2011-10-19T06:23:30+08:002011-10-19T06:23:30+08:00

    Resposta curta: Não.

    O InnoDB agrupa por meio da chave primária e, na ausência de uma chave primária, ele escolhe o primeiro índice exclusivo. Na ausência de um índice exclusivo, ele cria uma chave oculta de 6 bytes para clustering.

    Quando você tem a chave oculta de 6 bytes, quaisquer índices secundários referem-se a essa chave, em vez de ponteiros exatos para locais de linha (como em MyISAM), então você acaba com uma passagem de chave secundária e, em seguida, uma passagem de chave primária para encontrar seus registros .


    Para extrapolar um pouco a sua pergunta, presumo que você esteja preocupado com o ajuste da memória em uma árvore, porque para pesquisar com eficiência, todos os nós raiz devem estar na memória, pois você sempre precisa percorrer esse caminho para encontrar suas páginas de folha?

    Isso é verdade, mas um consolo é que os bancos de dados comerciais tentam tornar suas árvores o mais gordas possível, em vez de profundas. Tente executar xtrabackup --stats em seus dados para ver. Por exemplo:

    <INDEX STATISTICS>
      table: test/table1, index: PRIMARY, space id: 12, root page 3
      estimated statistics in dictionary:
        key vals: 25265338, leaf pages 497839, size pages 498304
      real statistics:
         level 2 pages: pages=1, data=5395 bytes, data/pages=32%
         level 1 pages: pages=415, data=6471907 bytes, data/pages=95%
            leaf pages: recs=25958413, pages=497839, data=7492026403 bytes, data/pages=91%
    

    Havia 497839 páginas de folha (~8 GB), mas apenas 416 páginas acima (6,5 MB). Eu executei esse comando algumas vezes em dados de produção e sempre me surpreende quando tenho milhões e bilhões de registros e apenas páginas de nível 1-3 + páginas de folha.

    • 3

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

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

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

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

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +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
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +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
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve