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 / 12080
Accepted
Ben
Ben
Asked: 2012-02-02 10:07:46 +0800 CST2012-02-02 10:07:46 +0800 CST 2012-02-02 10:07:46 +0800 CST

Como posso otimizar o desempenho em um MySQL ndbcluster?

  • 772

Então, isso é o que eu tenho:

Uma tabela simples classes__to_students:

|class   |student|
---------------
 Math     Alice
 Math     Bob
 Math     Peter
 Math     Anne
 Music    Bob
 Music    Chis
 Music    Debbie
 ...

Há 1000000 aulas. Cada aluno assiste a 500 aulas. (Analogia ruim, eu sei...) Para testar, há 4.000 alunos no banco de dados (então há 2.000.000 linhas), mas esse banco de dados deve lidar com vários milhões de alunos, é por isso que estou usando um MySQL ndbcluster.

De qualquer forma ... uma consulta como esta:

SELECT student, COUNT(class) as common_classes
FROM classes_table
WHERE class IN (my_subject_list)
GROUP BY student
ORDER BY common_classes DESC

resultando em algo como:

|student |commonClasses|
 Brad     6
 Melissa  4
 Chris    3
 Bob      3
 ...

leva cerca de 1 segundo com um mecanismo InnoDB em um servidor, o que é bom. Em um ndbcluster com 3 datanodes, a mesma consulta leva até 10 segundos, o que é demais. Não sei como o enunciado acima é tratado internamente, mas imagino que haja muita comunicação entre os nós, o que a torna lenta devido à latência. Alguém pode me dizer, o que acontece no cluster quando realizo esta consulta? Como posso torná-lo mais rápido?

Nota: esta é uma pergunta que surgiu depois que postei esta pergunta: https://stackoverflow.com/questions/9095054/how-do-i-compute-a-ranking-with-mysql-stored-procedures Para mais informações, dá uma olhada lá!

mysql performance
  • 2 2 respostas
  • 4249 Views

2 respostas

  • Voted
  1. Best Answer
    Mahesh Patil
    2012-02-02T23:51:38+08:002012-02-02T23:51:38+08:00

    Em primeiro lugar, Cluster é um mecanismo de armazenamento. Na verdade, ele não executa consultas porque não fala SQL. É por isso que você usa um servidor MySQL, que analisa suas consultas e envia chamadas de API do mecanismo de armazenamento de baixo nível para os nós de dados do cluster. Os nós de dados sabem como recuperar ou armazenar dados. Ou você pode conversar com os nós de dados diretamente usando as APIs do NDB.

    MySQL Cluster tem vários meios de execução de consultas. Eles se resumem a:

    • Pesquisa de chave primária

    • Pesquisa de chave exclusiva

    • Varredura de índice ordenada (ou seja, índices não exclusivos que usam árvores T)

    • Verificação completa da tabela

    Digamos que você tenha 4 nós de dados em seu cluster (NoOfReplicas=2). Isso significa que você tem 2 grupos de nós e cada um tem metade dos dados. O cluster usa um hash na chave primária (a menos que você tenha controlado o particionamento usando os recursos de particionamento 5.1). Portanto, para qualquer tabela, metade das linhas está em um grupo de nós e metade das linhas está em outro grupo de nós.

    Agora, para os 4 tipos de execução de consulta. Você pode verificar qual tipo de execução é usado com EXPLAIN. Veja como cada um funciona:

    Primary key lookup - the MySQL server can calculate the hash on the primary key and know which data node the relevant row resides in. Then the MySQL server contacts that data node and receives the row.
    Unique key lookup - the MySQL server cannot know which data node the row might be stored in. So it contacts a pseudo-random node. That data node has a hidden table that maps the unique key values to the primary key. Then the hash on the primary key reveals where the row resides.
    Ordered index scans are sent in parallel to all data nodes, where they search their local t-tree.
    Full table scans are send in parallel to all data nodes, where they scan their primary fragment.
    

    Resumo: as pesquisas de chave primária são as melhores. Se você tiver mais de 2 nós, a taxa de transferência aumenta porque todos os nós estão servindo ativamente diferentes fragmentos de dados. A pesquisa de índice ordenada e as varreduras completas da tabela são feitas em paralelo, portanto, mais nós levam a um melhor desempenho.

    • 4
  2. Mat Keep
    2012-02-16T03:42:46+08:002012-02-16T03:42:46+08:00

    Não tenho certeza de qual versão do Cluster você está usando, mas talvez valha a pena dar uma olhada no MySQL Cluster 7.2, que inclui um recurso chamado Adaptive Query Localization - isso empurrou as operações JOIN para os nós de dados onde são executadas em paralelo e em conjuntos locais do dados para melhorar drasticamente o desempenho do JOIN.

    Os testes mostraram um desempenho de JOIN 70 vezes maior

    Você pode ler mais sobre Cluster 7.2 e AQL aqui: http://dev.mysql.com/tech-resources/articles/mysql-cluster-7.2.html

    Há também um Guia de otimização de desempenho aqui (nota, registro necessário): http://mysql.com/why-mysql/white-papers/mysql_wp_cluster_perfomance.php

    • 4

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