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 / user-3196

Noah Goodrich's questions

Martin Hope
Noah Goodrich
Asked: 2016-09-16 08:37:37 +0800 CST

MySQL Query Optimizer Ingoring Index no Timestamp

  • 0

Eu tenho a seguinte tabela:

CREATE TABLE `matches` (
  `id` char(32) NOT NULL,
  `borrower_id` int(10) unsigned NOT NULL,
  `product_id` int(10) unsigned NOT NULL,
  `category_id` int(10) unsigned NOT NULL,
  `lender_id` int(10) unsigned NOT NULL,
  `classification_id` int(10) unsigned DEFAULT NULL,
  `status` enum('accepted','partial','potential','rejected') CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `classification` varchar(255) DEFAULT NULL,
  `category` varchar(255) DEFAULT NULL,
  `lender` varchar(255) DEFAULT NULL,
  `product` varchar(255) DEFAULT NULL,
  `created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `borrower_id` (`borrower_id`,`product_id`),
  KEY `status` (`status`),
  KEY `created_timestamp` (`created`),
  KEY `borrower_id_2` (`borrower_id`,`product_id`,`created`),
  KEY `borrower-product-classification` (`borrower_id`,`product_id`,`classification_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Quando executo EXPLAIN SELECT COUNT(*) FROM bi.matches WHERE created >= '2016-09-10';, obtenho os seguintes resultados:

| id | select_type | table  | type  |   possible_keys   |        key  | key_len | ref  |   rows   |          Extra                            |

|----|-------------|--------|------|-------|-------------------|------------------|---------|------|----------|--------------------------|      

    1| SIMPLE      | matches | range | created_timestamp | created_timestamp |       4 | NULL | 13288480 | Using where; Using index |

Mas quando eu executo esta consulta:

EXPLAIN SELECT COUNT(*)
FROM bi.matches m
INNER JOIN bi.matches m1
    ON m.borrower_id = m1.borrower_id
    AND m.product_id = m1.product_id
    AND m.created > m1.created
LEFT OUTER JOIN bi.matches m2
    ON m1.borrower_id = m2.borrower_id
    AND m1.product_id = m2.product_id
    AND m.created > m2.created
    AND (m1.created < m2.created OR (m1.created = m2.created AND m1.id < m2.id))
WHERE m.created >= '2016-09-10'
AND m2.id IS NULL
AND m.status = m1.status;

Eu recebo a seguinte explicação:

| id | select_type | table | type |                                    possible_keys                                    |               key               | key_len |               ref                |   rows   |                Extra                 |

|==========================================================================|
|  1 | SIMPLE      | m     | ALL  | borrower_id,status,created_timestamp,borrower_id_2,borrower-product-classification  | NULL                            | NULL    | NULL                             | 75151052 | Using where |

|  1 | SIMPLE      | m1    | ref  | borrower_id,status,created_timestamp,borrower_id_2,borrower-product-classification  | borrower-product-classification | 8       | bi.m.borrower_id,bi.m.product_id |        3 | Using where                          |

|  1 | SIMPLE      | m2    | ref  | PRIMARY,borrower_id,created_timestamp,borrower_id_2,borrower-product-classification | borrower_id_2                   | 8       | bi.m.borrower_id,bi.m.product_id |        4 | Using where; Not exists; Using index |

Por que o MySQL usaria created_timestampna consulta mais básica, mas não quando as junções estão envolvidas?

Também aqui está a saída deSHOW INDEXES FROM bi.matches

|  Table  | Non_unique |            Key_name             | Seq_in_index |    Column_name    | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
|=========================================================================|
| matches |          0 | PRIMARY                         |            1 | id                | A         |    75151052 | NULL     | NULL   |      | BTREE      |         |               |

| matches |          1 | borrower_id                     |            1 | borrower_id       | A         |      434399 | NULL     | NULL   |      | BTREE      |         |               |
| matches |          1 | borrower_id                     |            2 | product_id        | A         |    18787763 | NULL     | NULL   |      | BTREE      |         |               |

| matches |          1 | status                          |            1 | status            | A         |        2232 | NULL     | NULL   |      | BTREE      |         |               |

| matches |          1 | created_timestamp               |            1 | created           | A         |       37075 | NULL     | NULL   |      | BTREE      |         |               |

| matches |          1 | borrower_id_2                   |            1 | borrower_id       | A         |      521882 | NULL     | NULL   |      | BTREE      |         |               |

| matches |          1 | borrower_id_2                   |            2 | product_id        | A         |    18787763 | NULL     | NULL   |      | BTREE      |         |               |

| matches |          1 | borrower_id_2                   |            3 | created           | A         |    75151052 | NULL     | NULL   |      | BTREE      |         |               |

| matches |          1 | borrower-product-classification |            1 | borrower_id       | A         |      478669 | NULL     | NULL   |      | BTREE      |         |               |

| matches |          1 | borrower-product-classification |            2 | product_id        | A         |    25050350 | NULL     | NULL   |      | BTREE      |         |               |

| matches |          1 | borrower-product-classification |            3 | classification_id | A         |    18787763 | NULL     | NULL   | YES  | BTREE      |         |               |
mysql performance
  • 2 respostas
  • 247 Views
Martin Hope
Noah Goodrich
Asked: 2015-06-20 14:19:06 +0800 CST

Consulta para determinar as datas de início e término com base na sobreposição de tempo

  • 8

Dados os seguintes dados:

id      |   user_id |   started             |   closed              |   dead
-------------------------------------------------------------------------------------------
7714    |   238846  |   2015-01-27 15:14:50 |   2015-02-02 14:14:13 |   NULL
7882    |   238846  |   2015-01-28 13:25:58 |   NULL                |   2015-05-15 12:16:07
13190   |   259140  |   2015-03-17 10:11:44 |   NULL                |   2015-03-18 07:31:57
13192   |   259140  |   2015-03-17 10:12:17 |   NULL                |   2015-03-18 11:46:46
13194   |   259140  |   2015-03-17 10:12:53 |   NULL                |   2015-03-18 11:46:36
14020   |   259140  |   2015-03-23 14:32:16 |   2015-03-24 15:57:32 |   NULL
17124   |   242650  |   2015-04-16 16:19:08 |   2015-04-16 16:21:06 |   NULL
19690   |   238846  |   2015-05-15 13:17:31 |   NULL                |   2015-05-27 13:56:43
20038   |   242650  |   2015-05-19 15:38:17 |   NULL                |   NULL
20040   |   242650  |   2015-05-19 15:39:58 |   NULL                |   2015-05-21 12:01:02
20302   |   242650  |   2015-05-21 13:09:06 |   NULL                |   NULL
20304   |   242650  |   2015-05-21 13:09:54 |   NULL                |   NULL
20306   |   242650  |   2015-05-21 13:10:19 |   NULL                |   NULL
20308   |   242650  |   2015-05-21 13:12:20 |   NULL                |   NULL
21202   |   238846  |   2015-05-29 16:47:29 |   NULL                |   NULL
21204   |   238846  |   2015-05-29 16:47:56 |   NULL                |   NULL
21208   |   238846  |   2015-05-29 17:05:15 |   NULL                |   NULL
21210   |   238846  |   2015-05-29 17:05:55 |   NULL                |   NULL
21918   |   242650  |   2015-06-04 17:04:29 |   NULL                |   2015-06-12 15:47:23

Preciso construir um conjunto de dados que atenda às seguintes regras:

  1. Os grupos são definidos primeiro por user_id, então devemos comparar apenas os registros do mesmouser_id
  2. Todos os registros que começaram pelo menos 15 dias após qualquer outro registro ter sido iniciado, fechado ou morto devem ser contados como grupo.
  3. De cada grupo, o final deve ser calculado como o primeiro registro fechado ou todos os registros têm um valor para mortos e tomamos a maior data da coluna morta.
  4. Se um registro não for iniciado dentro de 15 dias após o início ou término de outro grupo, ele iniciará um novo agrupamento.

Provisoriamente, acredito que meus dados devem ficar assim:

usuário_id | começou | fim
-------------------------------------------------- ----
238846 | 27/01/2015 15:14:50 | 2015-02-02 14:14:13
259140 | 23/03/2015 14:32:16 | 2015-03-24 15:57:32
242650 | 16/04/2015 16:19:08 | 16/04/2015 16:21:06
242650 | 21/05/2015 13:09:06 | NULO
238846 | 15/05/2015 13:17:31 | NULO

Alguém pode fornecer algumas orientações sobre como criar uma consulta para atender a essas condições?

Aqui está um link para as instruções DDL e DML para os dados apresentados nesta pergunta.

Como alternativa, poderíamos pular as regras nº 2 e nº 4 e simplesmente declarar que apenas os registros que se sobrepõem devem ser incluídos. A regra mais importante é que, em um determinado conjunto, se houver uma data fechada, ela se tornará o fim do conjunto e não a maior data morta.

mysql
  • 2 respostas
  • 2383 Views
Martin Hope
Noah Goodrich
Asked: 2012-03-27 10:08:00 +0800 CST

Percona x MySQL

  • 23

O que é Percona?

Como ele difere do MySQL?

Quando devemos considerar a mudança (ou atualização) do MySQL padrão para o Percona?

Para adicionar alguns detalhes em nossa situação, usamos quase exclusivamente o InnoDB (que eu entendo que Percona otimizou bastante) com extensas restrições de chave estrangeira e alguns procedimentos armazenados.

O que estamos descobrindo no momento é que o MySQL está otimizando mal nossas consultas e, portanto, qualquer consulta que ultrapasse 3-4 junções, temos que construir explicitamente com junções STRAIGHT para melhorar o desempenho.

mysql performance
  • 2 respostas
  • 23018 Views
Martin Hope
Noah Goodrich
Asked: 2011-10-20 05:54:21 +0800 CST

Qual é a solução ideal para converter um esquema de banco de dados?

  • 2

Na verdade, quero me livrar das restrições existentes no banco de dados, o que sei que parece loucura, mas estamos atualizando nosso aplicativo para uma nova estrutura que depende dos nomes de restrição de chave estrangeira, além de fazermos várias limpezas e renomeações de campos, tabelas etc

Suponho que uma maneira melhor de enquadrar a questão é que, dado um banco de dados existente, precisa passar pelo seguinte:

  • Crie todas as novas restrições de chave estrangeira com nomes que funcionem dentro da estrutura
  • As tabelas serão renomeadas e/ou reestruturadas massivamente, incluindo a renomeação de campos que atualmente fazem parte de relacionamentos de chave estrangeira existentes

Qual é o melhor jeito de concluir isso?

Minhas soluções até agora foram:

  1. Crie um script de conversão (em php) que executará DROP FOREIGN KEY para todas as restrições no banco de dados. Isso resultou em erros estranhos ocorrendo durante as etapas posteriores do processo ao tentar ALTER TABLES e adicionar as novas restrições. Além disso, as restrições foram removidas, mas recebo erros se tento DROP as próprias chaves.
  2. Em vez de usar PHP e PDO, escreva o script de conversão usando SQL direto e use um CURSOR para DROP as restrições.
  3. Em vez de descartar as próprias restrições, converta as tabelas em MyIsam e DROP as chaves e, em seguida, converta de volta para Innodb antes de continuar com o restante do processo de conversão.
  4. Crie um novo esquema do zero e mova os dados do esquema antigo para o novo.

Gostaria de saber qual dessas abordagens seria considerada a mais válida? Ou se existe uma maneira melhor de fazer isso?

ATUALIZAÇÃO (essa informação foi solicitada na sala de bate-papo, então pensei em adicioná-la aqui):

  • O esquema atual tem 68 tabelas, o novo esquema será mais próximo de 55.
  • A maior tabela tem pouco mais de 800.000 linhas e, em geral, nossas tabelas estão na casa das dezenas de milhares.
  • O banco de dados inteiro tem aproximadamente 240 MB, mas a maior parte está em uma única tabela que armazena um grande campo de texto. Estaremos comprimindo isso durante a conversão.
mysql innodb
  • 3 respostas
  • 958 Views

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