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 / 343077
Accepted
Stephan Vos
Stephan Vos
Asked: 2024-10-18 21:22:50 +0800 CST2024-10-18 21:22:50 +0800 CST 2024-10-18 21:22:50 +0800 CST

Indexação ideal para uma grande tabela particionada

  • 772

Usei o guia de particionamento e indexação de Rick James para criar isso alguns anos atrás, mas agora, depois de ler o tutorial novamente, não tenho tanta certeza se entendi corretamente e se a tabela abaixo é a ideal. ( referência do guia )

Acho que um dos índices normais é redundante e não tenho certeza se devo deixar de fora a coluna de chave de particionamento (data/hora) ou alterar um dos índices para ter a coluna de chave de particionamento (data/hora) por último. Tê-lo como parte do índice ajudará no desempenho ao selecionar um intervalo de data/hora específico dentro de uma partição?

Também seria melhor ter a chave primária (deviceService, datetime) e ter um índice no incremento automático (id)?

A tabela baseada em séries temporais abaixo tem cerca de 80+ milhões de linhas por partição mensal. Ela é quase sempre consultada para um intervalo de data/hora específico e para um subconjunto de deviceServiceId's.

O particionamento é puramente para arquivamento e manutenção de tabelas e não para desempenho.

CREATE TABLE `serviceResultLinkState` 
(
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `deviceServiceId` int(10) unsigned NOT NULL,
  `dateTime` datetime NOT NULL DEFAULT current_timestamp(),
  `priority` tinyint(1) unsigned NOT NULL,
  `alias` varchar(20) NOT NULL,
  `active` tinyint(3) unsigned DEFAULT NULL,
  `stable` tinyint(3) unsigned DEFAULT NULL,
  `attempts` int(5) unsigned DEFAULT NULL,
  `retries` int(5) unsigned DEFAULT NULL,
  `resultState` tinyint(3) unsigned NOT NULL DEFAULT 0,
  PRIMARY KEY (`id`,`dateTime`),
  KEY `dt_ds_idx` (`deviceServiceId`),
  KEY `datetime_idx` (`dateTime`,`deviceServiceId`)
) ENGINE=InnoDB AUTO_INCREMENT=24814201874 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
 PARTITION BY RANGE  COLUMNS(`dateTime`)
(PARTITION `p_202405` VALUES LESS THAN ('2024-06-01 00:00:00') ENGINE = InnoDB,
 PARTITION `p_202406` VALUES LESS THAN ('2024-07-01 00:00:00') ENGINE = InnoDB,
 PARTITION `p_202407` VALUES LESS THAN ('2024-08-01 00:00:00') ENGINE = InnoDB,
 PARTITION `p_202408` VALUES LESS THAN ('2024-09-01 00:00:00') ENGINE = InnoDB,
 PARTITION `p_202409` VALUES LESS THAN ('2024-10-01 00:00:00') ENGINE = InnoDB,
 PARTITION `p_202410` VALUES LESS THAN ('2024-11-01 00:00:00') ENGINE = InnoDB,
 PARTITION `p_202411` VALUES LESS THAN ('2024-12-01 00:00:00') ENGINE = InnoDB,
 PARTITION `p_max` VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB);
mysql
  • 2 2 respostas
  • 44 Views

2 respostas

  • Voted
  1. Best Answer
    Rick James
    2024-10-20T04:25:00+08:002024-10-20T04:25:00+08:00
    • "não tenho certeza se a tabela é ótima" Ótima para quê? Velocidade? Espaço? Inserções? Atualizações? Seleções? A tabela parece que vai "funcionar".
    • A definição da tabela sugere que ela pode ser purgada após cerca de 6 meses. Se sim, o que você tem parece bom.
    • "acho que um dos índices normais é redundante" -- Os 3 (incluindo o PK) que você tem não são redundantes. Alguns podem não ser usados, essa é uma pergunta diferente. Sem ver as consultas principais, não posso responder a essa pergunta.
    • "chave primária (deviceService, datetime)" — Se esse par for necessariamente "único", então pode ser uma PK melhor.
    • idpode não ser necessário se você tiver o PK acima. (Novamente, depende das consultas.) Se idfor necessário, então, INDEX(id)além do PK acima, é suficiente para AUTO_INCREMENT.
    • "Tê-lo como parte do índice ajudará no desempenho ao selecionar um intervalo de data/hora específico dentro de uma partição?" Talvez. Deixe-me ver a consulta. A questão se resume a "Este índice composto é útil para esta consulta?". Eu discuto "qual é o melhor índice composto para esta consulta" em um Index Cookbook complementar
    • "consultado para um intervalo de data/hora específico e para um subconjunto de deviceServiceId's" -- WHERE x IN (...) AND y BETWEEN...é difícil de otimizar. O particionamento ajudará em alguns casos, não em outros. EXPLAIN SELECT ...mostrará quais partições estão sendo usadas para a consulta, mas não dará muitas pistas de quão bem o INou BETWEENestá sendo manipulado dentro de cada partição que ele usa.
    • "O particionamento serve apenas para arquivamento e manutenção de tabelas, e não para desempenho." -- Isso parece anular o restante das suas perguntas.
    • Esses são dados "sênior"? Se sim, tenho mais comentários.

    Mais

    • "Então eu estava pensando se ter um PK por deviceServiceId,datetimemelhoraria o tempo de pesquisa de seleção." -- Sim. Veja minha discussão aqui: https://mysql.rjweb.org/doc.php/mysql_sensor
    • (Eu teria partições semanais e faria a limpeza semanalmente. Mas mensalmente está bom.)
    • Ao plotar dados,... Se o gráfico tiver milhões de pontos de dados, é melhor ter apenas centenas ou milhares. Faça isso por meio de uma Tabela de Resumo
    • Eu evitaria idaté mesmo para operações de "manutenção". Em várias situações, idleva a overhead desnecessário.
    • WHERE x IN (...) AND y BETWEEN...pode ser substituível por um UNION ALL. Depende.
    • "dados seniores" -- Acho que eu estava tendo um "momento senior". Eu quis dizer "dados do sensor".

    Ainda mais

    • Rollup (via tabela(s) Summary) por hora e/ou dia. Se você precisar de "por hora" para qualquer coisa, isso provavelmente pode dobrar para "por dia".
    • Os rollups poderiam (se desejável) incluir máx./mín.
    • 0
  2. Stephan Vos
    2024-10-22T15:56:02+08:002024-10-22T15:56:02+08:00
    • "não tenho certeza se a tabela é ótima" Ótima para quê? Velocidade? Espaço? Inserções? Atualizações? Seleções? A tabela parece que vai "funcionar".
      (A velocidade da seleção é mais uma preocupação, pois é usada principalmente para traçar um gráfico de série temporal de métricas para um deviceServiceId específico. Então, eu estava pensando se ter um PK por deviceServiceId,datetime melhoraria o tempo de pesquisa de seleção. Veja a consulta principal mais abaixo)

    • "A definição da tabela sugere que ela pode ser purgada após cerca de 6 meses. Se for assim, o que você tem parece bom." (Correto)

    • "acho que um dos índices normais é redundante" -- Os 3 (incluindo o PK) que você tem não são redundantes. Alguns podem não ser usados, essa é uma pergunta diferente. Sem ver as consultas principais, não posso responder a essa pergunta.
      (Este é o tipo mais comum de consulta executada nesta tabela que tem dados por minuto de intervalo. Pode ter uma variação de data e hora dependendo do período em que os dados são consultados:
      select sr.dateTime, sr.alias, sr.resultState from serviceResultLinkState sr where sr.deviceServiceId = 567403 and dateTime >= curdate() - interval 24 hour; )

    • "chave primária (deviceService, datetime)" — Se esse par for necessariamente "único", então pode ser uma PK melhor.
      (Acho que será único, pois as métricas são persistidas a cada minuto para um deviceServiceId, então o registro de data e hora deve ser único)

    • "id pode não ser necessário se você tiver o PK acima. (Novamente, depende das consultas.) Se id for necessário, então INDEX(id) além do PK acima é suficiente para AUTO_INCREMENT."
      (Indexar em id foi benéfico no passado, pois permite abordar um bloco específico de dados para operações de tipo de manutenção usando intervalo de id de forma mais rápida, mas talvez um pk modificado tenha o mesmo benefício?)

    • "Tê-lo como parte do índice ajudará no desempenho ao selecionar um intervalo de data/hora específico dentro de uma partição?" Talvez. Deixe-me ver a consulta. A questão se resume a "Este índice composto é útil para esta consulta?". Eu discuto "qual é o melhor índice composto para esta consulta" em um Index Cookbook complementar "consultado para um intervalo de data/hora específico e para um subconjunto de deviceServiceId's" -- WHERE x IN (...) AND y BETWEEN... é difícil de otimizar. O particionamento ajudará em alguns casos, não em outros. EXPLAIN SELECT ... mostrará quais partições estão sendo usadas para a consulta, mas não dará muitas pistas de quão bem o IN ou BETWEEN está sendo tratado dentro de cada partição que ele usa.
      (O IN não é, na verdade, comum para acessar esta tabela - para processos de resumo de rollup, eu abordaria cada devicveServiceId individualmente ou juntaria em outra tabela filtrada para a lista de deviceServiceId's em que estamos interessados)

    • "O particionamento é puramente para arquivamento e manutenção de tabelas, e não para desempenho." -- Isso parece anular o restante de suas perguntas.
      (Quase sempre consultaríamos esta tabela para dados recentes, então a única vez que ela talvez abrangeria duas partições seria, por exemplo, olhando os dados dos últimos 7 dias, que poderiam ter alguns dias na partição anterior)

    • Esses são dados "sênior"? Se sim, tenho mais comentários.
      (Não tenho certeza do que você quer dizer com isso?)

    • 0

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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

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

    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
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • 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
    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

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