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

kriegu's questions

Martin Hope
kriegu
Asked: 2017-04-29 15:38:06 +0800 CST

Consulta usando índice com ordem por

  • 0

Atualmente estou verificando o slow_query_log com índices log_queries_not_using habilitados de uma instância mysql. Há uma consulta que aparece com muita frequência, não é uma consulta lenta, mas uma consulta que não usa índices.

A consulta tem a seguinte estrutura:

select ...
from `Tb1`
left join `Tb2` on `Tb1`.`id` = `Tb2`.`id_tb1`
left join `Tb3` on `Tb2`.`id_common` = `Tb3`.`id_common`
left join `Tb4` on `Tb2`.`id` = `Tb4`.`id_tb2`
left join `Tb5` on `Tb1`.`id_tb5` = `Tb5`.`id`;

A explicação para esta consulta é a seguinte:

+----+-------------+--------+------------+--------+-----------------+------------------+---------+-----------------------+------+----------+-------------+
| id | select_type | table  | partitions | type   | possible_keys   | key              | key_len | ref                   | rows | filtered | Extra       |
+----+-------------+--------+------------+--------+-----------------+------------------+---------+-----------------------+------+----------+-------------+
|  1 | SIMPLE      | Tb1    | NULL       | ALL    | NULL            | NULL             | NULL    | NULL                  |    1 |   100.00 | NULL        |
|  1 | SIMPLE      | Tb2    | NULL       | ref    | fk_tb2_tb1_idx  | fk_tb2_tb1_idx   | 4       | schema.tb1.id         |    1 |   100.00 | NULL        |
|  1 | SIMPLE      | Tb3    | NULL       | ref    | fk_tb2_tb3_idx  | fk_tb2_tb3_idx   | 4       | schema.Tb2.id_common  |    1 |   100.00 | Using index |
|  1 | SIMPLE      | Tb4    | NULL       | ref    | fk_tb4_tb2_idx  | fk_tb4_tb2_idx   | 4       | schema.Tb2.id         |    1 |   100.00 | NULL        |
|  1 | SIMPLE      | Tb5    | NULL       | eq_ref | PRIMARY         | PRIMARY          | 4       | schema.tb1.id_tb5     |    1 |   100.00 | NULL        |
+----+-------------+--------+------------+--------+-----------------+------------------+---------+-----------------------+------+----------+-------------+

Como podemos ver na saída da explicação, a consulta não usa nenhum índice em Tb1, embora tenha índices nas colunas nas quais são unidas a outras tabelas.

QUESTÃO 1:

Por que essa consulta não usa o índice na tabela Tb1?

Então, tentei usar um "order by" usando o id de Tb1 assim:

select ...
from `Tb1`
left join `Tb2` on `Tb1`.`id` = `Tb2`.`id_tb1`
left join `Tb3` on `Tb2`.`id_common` = `Tb3`.`id_common`
left join `Tb4` on `Tb2`.`id` = `Tb4`.`id_tb2`
left join `Tb5` on `Tb1`.`id_tb5` = `Tb5`.`id`
order by Tb1.id;

Obtendo o seguinte resultado na explicação:

    +----+-------------+--------+------------+--------+-----------------+-------------------+---------+----------------------+------+----------+-------------+
    | id | select_type | table  | partitions | type   | possible_keys   | key               | key_len | ref                  | rows | filtered | Extra       |
    +----+-------------+--------+------------+--------+-----------------+-------------------+---------+----------------------+------+----------+-------------+
    |  1 | SIMPLE      | Tb1    | NULL       | index  | NULL            | PRIMARY           | 4       | NULL                 |    1 |   100.00 | NULL        |
    |  1 | SIMPLE      | Tb2    | NULL       | ref    | fk_tb2_tb1_idx  | fk_tb2_tb1_idx    | 4       | schema.tb1.id        |    1 |   100.00 | NULL        |
    |  1 | SIMPLE      | Tb3    | NULL       | ref    | fk_tb2_tb3_idx  | fk_tb2_tb3_idx    | 4       | schema.Tb2.id_common |    1 |   100.00 | Using index |
    |  1 | SIMPLE      | Tb4    | NULL       | ref    | fk_tb4_tb2_idx  | fk_tb4_tb2_idx    | 4       | schema.Tb2.id        |    1 |   100.00 | NULL        |
    |  1 | SIMPLE      | Tb5    | NULL       | eq_ref | PRIMARY         | PRIMARY           | 4       | schema.tb1.id_tb5    |    1 |   100.00 | NULL        |
    +----+-------------+--------+------------+--------+-----------------+-------------------+---------+----------------------+------+----------+-------------+

Como podemos ver a partir da saída de explicação no. 2, ele agora usa a chave primária como índice.

QUESTÃO 2:

Usando esta ordem: a) Vai melhorar o desempenho da consulta? b) O desempenho da consulta seria o mesmo. c) Vai degradar o desempenho da consulta?

mysql performance
  • 2 respostas
  • 122 Views
Martin Hope
kriegu
Asked: 2015-08-13 15:11:56 +0800 CST

Sequências Oracle para MySQL

  • 3

Migrando do Oracle para o MySQL, encontramos muitos problemas de incompatibilidade. Temos algumas soluções alternativas para muitos deles, porém ainda temos um: As Sequências

temos esta mesa

CREATE TABLE "HEADS"(   
    "HEAD_ID" NUMBER NOT NULL ENABLE,
    "COLUMN" NUMBER NOT NULL ENABLE,
    "ROW" NUMBER NOT NULL ENABLE,
    "VALUE" VARCHAR2(200),
    "CREATED_BY" VARCHAR2(40),
    "CREATED_DATE" DATE,
    "MODIFIED_BY" VARCHAR2(40),
    "MODIFIED_DATE" DATE                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
   )

Observe que HEAD_ID não é uma chave primária e, portanto, não é exclusiva. Porém, em uma Stored Procedure temos este código:

   declare var_id,sequences number;
   SELECT CRM_SEQ_GIS_FCEHEAD.NEXTVAL INTO sequences FROM DUAL;
   INSERT INTO HEADS (
            HEAD_ID,
            COLUMN,
            ROW,
            VALUE,
            CREATED_BY,
            CREATED_DATE
            ) ( SELECT
               sequences,
               COLUMN,
               ROW,
               VALUE,
               CREATED_BY,
               SYSDATE
               FROM HEADS
               WHERE HEAD_ID = var_id );

Sendo var_id qualquer valor numérico dado.

Ele usa uma sequência para obter o próximo valor para HEAD_ID. Qual seria a abordagem para fazer isso no MySQL?

Sabemos que as sequências equivalentes no MySQL são as colunas auto_increment. Mas para uma coluna ser auto_increment, ela deve ser a chave primária e ser única. A coluna no oracle não é PK nem UNIQUE. Tem valores repetidos para HEAD_ID.

mysql oracle
  • 1 respostas
  • 537 Views
Martin Hope
kriegu
Asked: 2015-07-17 11:09:50 +0800 CST

O esquema de informações não mostra informações confiáveis?

  • 3

Atualmente estou migrando do SQL Server para o MySQL. Quando tento corresponder ao número de linhas, consulto information_Schema.tables. Percebi que existem algumas diferenças entre as informações migradas e as informações de origem.

No entanto, eu fiz um select count(*) from table;me deu o número correto de linhas

Por que há uma diferença entre the information_Schema.tables.table_rowse the select count(*) from table?

mysql innodb
  • 2 respostas
  • 2016 Views
Martin Hope
kriegu
Asked: 2015-04-10 07:44:08 +0800 CST

Acelerando inserções de colunas longtext ou longblob

  • 2

atualmente estou migrando um banco de dados DB2 para MySQL, usando a ferramenta SQL WORKBENCH

Ele basicamente seleciona do DB2 e insere no DB2.

Funciona bem, mas nas tabelas com colunas longblob ou longtext (para armazenar xml ou imagens) leva muito tempo. (cerca de 40 horas para uma tabela de 10 milhões de linhas).

Fatos:

  • Servidor: 2CPU CORES e 8GB de RAM SO: Linux RHEL 6.5

  • Servidor MySQL 5.6.13

  • As tabelas são InnoDB.

  • O servidor MySQL e a ferramenta de migração estão no mesmo computador, portanto não há sobrecarga de rede.

  • As tabelas no MySQL possuem CHAVES PRIMÁRIAS, mas nenhum outro índice.

  • Desativei o log binário para a inserção massiva.

  • Eu configurei a ferramenta de migração para fazer uma inserção em lote de 10
    linhas e confirmar cada inserção (10 linhas).

Duas perguntas aqui:

  1. Quais são os valores recomendados para o tamanho do batch insert, considerando o tamanho das colunas (longtext, longblob)?
  2. Existe algum ajuste recomendado no my.cnf para melhorar o desempenho da inserção?

Aqui está o conteúdo do arquivo my.cnf:

[mysqld]

open_files_limit=2048
table_open_cache=1024
query_cache_type=1
query_cache_size=64M
tmp_table_size=32M
thread_cache_size=9
default-storage-engine=INNODB
back_log=80
flush_time=0
join_buffer_size=1M
max_allowed_packet=1G
max_connect_errors=100
sort_buffer_size=256K
table_definition_cache=1400
binlog_row_event_max_size=8K
log-bin
log_bin_trust_function_creators=1

#INNODB
innodb_additional_mem_pool_size=8M
innodb_flush_log_at_trx_commit=1
innodb_data_file_path = ibdata1:5G:autoextend
innodb_log_buffer_size=16M
innodb_buffer_pool_size=6144M
innodb_log_file_size=1GB
innodb_thread_concurrency=3
innodb_autoextend_increment=64
innodb_concurrency_tickets=5000
innodb_old_blocks_time=1000
innodb_open_files=300
innodb_stats_on_metadata=0
innodb_file_per_table=1
innodb_checksum_algorithm=0
mysql performance
  • 2 respostas
  • 2377 Views
Martin Hope
kriegu
Asked: 2015-03-14 16:11:30 +0800 CST

Limpando logs binários automaticamente

  • 10

No momento, estou tentando criar um evento agendado no MySQL para limpar os logs binários toda semana.

A instrução create event é a seguinte:

CREATE EVENT purgebinlogs
ON SCHEDULE EVERY 1 WEEK
STARTS CONCAT(CURRENT_DATE + INTERVAL 7 - WEEKDAY(CURRENT_DATE) DAY,' 01:00:00')
DO
PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY);

Deve ser executado toda segunda-feira à 01:00. No entanto, se eu consultar a tabela mysql.event, obtenho a seguinte saída:

mysql> select * from mysql.event\G
*************************** 1. row ***************************
                  db: mysql
                name: purgebinlogs
                body: PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY)
             definer: root@localhost
          execute_at: NULL
      interval_value: 7
      interval_field: WEEK
             created: 2015-03-13 17:45:20
            modified: 2015-03-13 17:51:43
       last_executed: NULL
              starts: 2015-03-16 07:00:00
                ends: NULL
              status: ENABLED
       on_completion: DROP
            sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
             comment:
          originator: 1
           time_zone: SYSTEM
character_set_client: cp850
collation_connection: cp850_general_ci
        db_collation: utf8_general_ci
           body_utf8: PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY)

Como você pode ver, a coluna inicial diz:

início: 2015-03-16 07:00:00

A data está OK, mas a hora... Deve ser 01:00 e não 07:00

Acho que isso pode ser um problema de fuso horário, porque meu fuso horário é "-06:00"

mysql> show global variables like 'time_z%';
+------------------+----------+
| Variable_name    | Value    |
+------------------+----------+
| time_zone        | -06:00   |
+------------------+----------+
2 rows in set, 1 warning (0.01 sec)

mysql> SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP);
+--------------------------------+
| TIMEDIFF(NOW(), UTC_TIMESTAMP) |
+--------------------------------+
| -06:00:00                      |
+--------------------------------+
1 row in set (0.00 sec)

Mas não consigo adivinhar como consertar isso. Quero executar o evento agendado às 01:00

EDITAR

ao consultar information_schema.events ele exibe as informações corretas

mysql> select * from information_schema.events\G
*************************** 1. row ***************************
       EVENT_CATALOG: def
        EVENT_SCHEMA: mysql
          EVENT_NAME: purgebinlogs
             DEFINER: root@localhost
           TIME_ZONE: SYSTEM
          EVENT_BODY: SQL
    EVENT_DEFINITION: PURGE BINARY LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 7 DAY)
          EVENT_TYPE: RECURRING
          EXECUTE_AT: NULL
      INTERVAL_VALUE: 1
      INTERVAL_FIELD: WEEK
            SQL_MODE: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
              STARTS: 2015-03-16 01:00:00
                ENDS: NULL
              STATUS: ENABLED
       ON_COMPLETION: NOT PRESERVE
             CREATED: 2015-03-13 17:45:20
        LAST_ALTERED: 2015-03-13 17:56:32
       LAST_EXECUTED: NULL
       EVENT_COMMENT:
          ORIGINATOR: 1
CHARACTER_SET_CLIENT: cp850
COLLATION_CONNECTION: cp850_general_ci
  DATABASE_COLLATION: utf8_general_ci

Então eu acho que mysql.event exibe informações no horário UTC não no fuso horário local

EDITAR

Conforme sugerido por @Rick James, alterei dinamicamente o valor de expire_logs_days com o seguinte comando:

set global expire_logs_days=7

Mas parece que não está funcionando....

mysql> show global variables like 'expire%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 7     |
+------------------+-------+

No entanto, se eu listar os arquivos binlog, obtenho a seguinte lista:

 Mar  5 19:30 mysql56_bin.000001
 Mar  5 19:30 mysql56_bin.000002
 Mar 10 13:53 mysql56_bin.000003
 Mar 11 11:59 mysql56_bin.000004
 Mar 11 17:44 mysql56_bin.000005
 Mar 12 12:53 mysql56_bin.000006
 Mar 12 12:58 mysql56_bin.000007
 Mar 12 13:02 mysql56_bin.000008
 Mar 12 13:07 mysql56_bin.000009
 Mar 12 13:12 mysql56_bin.000010
 Mar 12 13:16 mysql56_bin.000011
 Mar 12 13:20 mysql56_bin.000012
 Mar 12 13:24 mysql56_bin.000013
 Mar 17 10:38 mysql56_bin.000014
 Mar 17 18:27 mysql56_bin.000015
 Mar 17 18:28 mysql56_bin.000016
 Mar 17 18:28 mysql56_bin.index

Como você pode ver, há binlogs com mais de uma semana atrás.

mysql
  • 7 respostas
  • 24971 Views
Martin Hope
kriegu
Asked: 2015-03-07 16:01:18 +0800 CST

O que custa menos tempo?

  • 0

Estou migrando um banco de dados de DB2 para MySQL. Existem mesas grandes, por isso leva muito tempo. A questão aqui é:

Se houver uma tabela com cerca de 9 milhões de registros com o mecanismo de armazenamento InnoDB.

Qual das próximas abordagens levaria menos tempo?

  1. Crie a tabela sem índices, chaves estrangeiras ou quaisquer restrições. Carregue os dados. Altere a tabela para definir as restrições

  2. Crie a tabela com restrições e carregue os dados.

Em teoria, a carga dos dados em uma tabela indexada é mais lenta do que em uma tabela não indexada. Mas criar um índice e chaves estrangeiras em grandes tabelas leva muito tempo.

mysql performance
  • 1 respostas
  • 55 Views
Martin Hope
kriegu
Asked: 2014-11-20 10:47:25 +0800 CST

Existe uma maneira de evitar caracteres especiais em objetos de esquema?

  • 2

Gostaria de impedir a criação de objetos com espaços ou caracteres especiais. Existe uma maneira de permitir apenas letras, números e o sublinhado?

Obrigado!

mysql
  • 1 respostas
  • 1303 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