Recursos ocultos do MySQL


15

Na longa tradição de ter recursos ocultos, vamos ter uma lista de recursos ocultos no MySQL.

Coloque um recurso por resposta.

Consulte também:
Recursos ocultos do Linux
Recursos ocultos do PowerShell
Recursos ocultos do banco de dados Oracle
Recursos ocultos do Windows 2008
Recursos ocultos do Solaris / OpenSolaris
Recursos ocultos do SQL Server
Recursos ocultos do IIS (6.0 / 7.0)

Respostas:


9

Um frequentemente não utilizado, mas mais detalhado

MOSTRAR LISTA DE PROCESSOS COMPLETA

é útil, mas não tão bom quanto o incrível analisador de consultas não corporativas - habilite assim

    mysql> set profiling = 1;
    Consulta OK, 0 linhas afetadas (0,00 s)

Essas duas são consultas indesejadas para preencher a tabela de perfis,

        
    mysql> selecione * de _test.customers;
    ERRO 1146 (42S02): A tabela '_test.customers' não existe

    mysql> select * from test.customers limit 0;
    Conjunto vazio (0,00 seg)
    

Obtenha uma lista de todas as consultas com perfil e sua duração

        
    mysql> show profiles;
    + ---------- + ------------ + ------------------------- ------ +
    | Query_ID | Duração | Consulta |
    + ---------- + ------------ + ------------------------- ------ +
    | 1 | 0.00013400 | selecione * em _test.customers |
    | 2 0,01546500 | selecione * em test.customers |
    + ---------- + ------------ + ------------------------- ------ +

As informações de exibição da última consulta seriam apenas "mostrar perfil" - ou você pode especificar uma consulta

  
    mysql> show profile para a query 2;
    + ---------------------- + ---------- +
    | Status Duração |
    + ---------------------- + ---------- +
    | começando | 0,000053
    | verificando permissões | 0,000007
    | Mesas de abertura | 0,000014 |
    | Bloqueio do sistema | 0,000006
    | Fechadura de mesa | 0,000008
    | init 0,000065 |
    | otimizando | 0,000003
    | executando | 0,000201 |
    | fim | 0,000003
    | fim da consulta | 0,000002
    | liberando itens | 0,000020 |
    | log consulta lenta | 0,000002
    | limpeza | 0,000004
    + ---------------------- + ---------- +
    13 linhas em conjunto (0,00 s)

Você também pode solicitar informações específicas, como CPU, BLOCK IO e SWAPS, entre outras ( todas na página de manual )

  
    mysql> show profile cpu para a consulta 2;
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | Status Duração | CPU_user | CPU_system |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | começando | 0,000056 0,001000 | 0,000000 |
    | verificando permissões | 0,000007 0,000000 | 0,000000 |
    | Mesas de abertura | 0,000010 | 0,000000 | 0,000000 |
    | Bloqueio do sistema | 0,000005 0,000000 | 0,000000 |
    | Fechadura de mesa | 0,000007 0,000000 | 0,000000 |
    | init 0,000059 0,000000 | 0,000000 |
    | otimizando | 0,000003 0,000000 | 0,000000 |
    | estatísticas 0,015022 0,000000 | 0,000000 |
    | preparando | 0,000014 | 0,001000 | 0,000000 |
    | executando | 0,000004 0,000000 | 0,000000 |
    | Enviando dados | 0,000245 | 0,000000 | 0,000000 |
    | fim | 0,000004 0,000000 | 0,000000 |
    | fim da consulta | 0,000002 0,000000 | 0,000000 |
    | liberando itens | 0,000021 0,000000 | 0,000000 |
    | log consulta lenta | 0,000002 0,000000 | 0,000000 |
    | limpeza | 0,000004 0,000000 | 0,000000 |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    16 linhas em conjunto (0,00 s)

Não se esqueça de desativá-lo posteriormente, pois o log adiciona sobrecarga.

  
    mysql> set profiling = 0;
    Consulta OK, 0 linhas afetadas (0,00 s)

você também pode usar o SHOW PROFILE ALL FOR QUERY X para mostrar todos os dados de criação de perfil.
Kedare

8

Alguns comandos do MySQL que nem sempre são conhecidos ou lembrados.

Altere a orientação do conjunto de resultados para vertical para facilitar a leitura e a colagem.

mysql> SELECT CURDATE(), CURTIME()\G
*************************** 1. row ***************************
CURDATE(): 2009-06-26
CURTIME(): 12:10:37

Cancele a consulta que você está digitando no momento e a deixe em seu histórico.

mysql> SELECT CURDATE(), CURTIME()\c
mysql>

Edite uma consulta ou a última consulta (respectivamente) com seu $ EDITOR favorito.

mysql> SELECT CURDATE(), CURTIME()\e
mysql> \e

Limpe a saída do console.

mysql> \! clear

Compare os conjuntos de resultados pelo hash MD5.

mysql> pager md5sum -
PAGER set to 'md5sum -'
mysql> SELECT CURDATE(), CURTIME();
d24e22e4e2d33dfda9f01ba934b7676a  -
mysql> nopager
PAGER set to stdout

Mude o seu prompt.

mysql> prompt (\u@\h) [\d]>\_
PROMPT set to '(\u@\h) [\d]>\_'
(dan@localhost) [test]>

Pesquise no histórico de comandos por uma determinada sequência (como o Bash).
Comece a digitar um termo de pesquisa e repita ^ R para percorrer os resultados.

^R
(reverse-i-search)`DATE': SELECT CURDATE(), CURTIME();

+1 em md5sum. Eu gosto da md5sum -ideia de usar como pager. Th não é realmente específico do mysql
serverhorror 26/06/09

4

Truques que aprendi que podem ser úteis para alguns:

Para executar o arquivo que você salvou anteriormente:

source filename      # Alternatively you can enter "\\. filename".

Usar "\!" para acessar comandos do shell. Por exemplo:

\\! ls c*sql   # To list all your SQL files in directory starting with "c".

Portanto, se você quiser escrever sua declaração em um arquivo (sem usar a opção de editor), digite:

\\! echo 'select * from emp where job ="salesman" '   > test2.sql   # Editor option seems easier to me though!

Se você digitar

\\T filename

você terá suas instruções e os resultados da consulta direcionados / impressos para o arquivo especificado. Use \\tpara desativar isso.

Encerre uma consulta com em \\Gvez de ";" para mostrar a saída em um formato de linha em vez de em colunas.

Não descarte o uso de uma cláusula Where ... LIKE com a instrução SHOW. Por exemplo:

SHOW STATUS LIKE '%cache%';

Por fim, para encontrar a localização do seu diretório de dados MySQL sem olhar para o my.cnfarquivo, use:

SHOW VARIABLES LIKE 'datadir';

3

Eu pessoalmente gosto do SHOWcomando

Você poderia fazer
SHOW PROCESSLIST- Para ver todas as conexões em execução no mysql
SHOW CREATE TABLE TableName- Para ver o sql usado para criar a tabela
SHOW CREATE PROCEDURE ProcedureName- Para ver o sql usado para criar o SP
SHOW VARIABLES- Para ver todas as variáveis ​​do sistema

Obtenha a lista completa aqui


1
Estou um pouco confuso por você listar comandos bem conhecidos e documentados, como SHOW e EXPLAIN como "recursos ocultos". Não é um recurso oculto que não esteja documentado?
317 John Gardeniers

Bem, a intenção é trazer à tona os comandos úteis não tão conhecidos; o que pode ser bem conhecido por alguém pode ser desconhecido por outra pessoa, o que dizer?
Binoj Antony

3

Na verdade documentado , mas muito irritante: conversões automáticas de data para dados incorretos.

Antes do MySQL 5.0.2, o MySQL perdoava valores de dados ilegais ou impróprios e os coagia a valores legais para entrada de dados. No MySQL 5.0.2 e superior, esse permanece o comportamento padrão, mas você pode alterar o modo SQL do servidor para selecionar um tratamento mais tradicional de valores inválidos, de forma que o servidor os rejeite e anule a instrução na qual eles ocorrem.

Às vezes, você terá "sorte" quando o MySQL não ajustar a entrada para datas válidas próximas, mas a armazenará como 0000-00-00qual por definição é inválida. No entanto, mesmo assim, você pode querer que o MySQL falhe em vez de armazenar silenciosamente esse valor para você.


3

Outro recurso que diferencia o MySQL de outros bancos de dados é o REPLACE INTOcomando. Você pode fazer:

REPLACE INTO T1 (Col1, Col2 )
SELECT Col1, Col2 FROM T2;

Você também pode escrever a instrução de substituição, assim como a instrução de atualização:

REPLACE INTO T1 
SET Col1 = 'SomeValue1'
, Col2   = 'SomeValue2'

1
REPLACE INTO é útil, mas deve-se notar que executa uma verificação de chave, DELETEs se uma chave correspondente for encontrado, finalmente, INSERTs, que leva muito mais tempo do que o INSERT ... ON DUPLICATE KEY ATUALIZAÇÃO
Andy

2

Não é realmente um recurso oculto, mas é menos conhecido e eu o uso muito para salvar uma consulta e verificar se existe algo antes de fazer uma atualização ou inserção

INSERT ... ON DUPLICATE KEY UPDATE

A documentação está aqui


1

Para ver o plano de execução da consulta, use EXPLAIN

por exemplo

EXPLAIN 
SELECT T1.Col1, T2.Col2
FROM T1 INNER JOIN T2 ON T1.Id = T2.Id
WHERE T1.Col3 = 10

1

Não é realmente oculto, mas o log de consultas lentas pode ser realmente útil para rastrear a causa dos problemas de desempenho nos horários de pico.

No arquivo my.cnf, seção [mysqld] - adicione:

log_slow_queries=/var/log/mysql/mysql-slow.log
# log queries that took more than 1 sec
long_query_time = 1


0

Assim como uma adição à resposta do pQD (como noobie ainda não consigo adicionar um comentário), se você ainda não adicionou o caminho para o log de consultas lentas no arquivo my.cnf correto, o log de erros será gravado no diretório de dados (use SHOW VARIABLES LIKE 'datadir'; para descobrir onde fica) e o nome do arquivo estará no formato [systemname] -slow.log

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.