Funzionalità nascoste di MySQL


15

Nella lunga tradizione di avere funzioni nascoste, cerchiamo di avere un elenco di funzioni nascoste in MySQL.

Inserisci una funzione per risposta.

Vedi anche:
Funzionalità nascoste di Linux
Funzionalità nascoste di PowerShell Funzionalità
nascoste di Oracle Database
Funzionalità nascoste di Windows 2008
Funzionalità nascoste di Solaris / OpenSolaris
Funzionalità nascoste di SQL Server
Funzionalità nascoste di IIS (6.0 / 7.0)

Risposte:


9

Uno spesso inutilizzato ma più dettagliato

MOSTRA ELENCO DEI PROCESSI COMPLETO

è utile, ma non buono come il fantastico analizzatore di query non aziendale - abilitare in questo modo

    mysql> set profiling = 1;
    Query OK, 0 righe interessate (0.00 sec)

Queste due sono query spazzatura per riempire la tabella dei profili,

        
    mysql> seleziona * da _test.customers;
    ERRORE 1146 (42S02): la tabella '_test.customers' non esiste

    mysql> seleziona * da test.customers limit 0;
    Set vuoto (0,00 sec)
    

Ottieni un elenco di tutte le query profilate e della loro durata

        
    mysql> mostra i profili;
    + ---------- + ------------ + ------------------------- ------ +
    | Query_ID | Durata | Query |
    + ---------- + ------------ + ------------------------- ------ +
    | 1 | 0,00013400 | seleziona * da _test.customers |
    | 2 | 0.01546500 | selezionare * da test.customers |
    + ---------- + ------------ + ------------------------- ------ +

Le informazioni di visualizzazione per l'ultima query sarebbero semplicemente "mostra profilo" oppure puoi specificare una query

  
    mysql> mostra il profilo per la query 2;
    + ---------------------- + ---------- +
    | Stato | Durata |
    + ---------------------- + ---------- +
    | inizio | 0,000053 |
    | controllo dei permessi | 0,000007 |
    | Tabelle di apertura | 0,000014 |
    | Blocco del sistema | 0,000006 |
    | Blocco tavolo | 0,000008 |
    | init | 0,000065 |
    | ottimizzazione | 0,000003 |
    | esecuzione | 0.000201 |
    | fine | 0,000003 |
    | fine query | 0,000002 |
    | liberare oggetti | 0,000020 |
    | registrazione query lenta | 0,000002 |
    | pulizia | 0,000004 |
    + ---------------------- + ---------- +
    13 righe in set (0,00 sec)

Puoi anche richiedere informazioni specifiche come CPU, BLOCK IO e SWAPS tra le altre ( tutte nella pagina man )

  
    mysql> mostra il profilo cpu per la query 2;
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | Stato | Durata | CPU_user | CPU_system |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | inizio | 0,000056 | 0,001000 | 0,000000 |
    | controllo dei permessi | 0,000007 | 0,000000 | 0,000000 |
    | Tabelle di apertura | 0,000010 | 0,000000 | 0,000000 |
    | Blocco del sistema | 0,000005 | 0,000000 | 0,000000 |
    | Blocco tavolo | 0,000007 | 0,000000 | 0,000000 |
    | init | 0,000059 | 0,000000 | 0,000000 |
    | ottimizzazione | 0,000003 | 0,000000 | 0,000000 |
    | statistiche | 0.015022 | 0,000000 | 0,000000 |
    | preparazione | 0,000014 | 0,001000 | 0,000000 |
    | esecuzione | 0,000004 | 0,000000 | 0,000000 |
    | Invio di dati | 0.000245 | 0,000000 | 0,000000 |
    | fine | 0,000004 | 0,000000 | 0,000000 |
    | fine query | 0,000002 | 0,000000 | 0,000000 |
    | liberare oggetti | 0,000021 | 0,000000 | 0,000000 |
    | registrazione query lenta | 0,000002 | 0,000000 | 0,000000 |
    | pulizia | 0,000004 | 0,000000 | 0,000000 |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    16 righe in set (0,00 sec)

Non dimenticare di disabilitarlo in seguito, poiché la registrazione aggiunge sovraccarico.

  
    mysql> set profiling = 0;
    Query OK, 0 righe interessate (0.00 sec)

puoi anche utilizzare MOSTRA TUTTO IL PROFILO PER QUERY X per mostrare tutti i dati di profilazione.
Kedare,

8

Alcuni comandi MySQL che non sono sempre comunemente conosciuti o ricordati.

Cambia l'orientamento del set di risultati in verticale per una facile lettura e incolla.

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

Annulla la query che stai digitando mentre la lasci nella cronologia.

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

Modifica una query o l'ultima query (rispettivamente) con il tuo $ EDITOR preferito.

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

Cancella l'output della console.

mysql> \! clear

Confronta i set di risultati con l'hash MD5.

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

Cambia il tuo prompt.

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

Cerca nella cronologia dei comandi una determinata stringa (come Bash).
Inizia a digitare un termine di ricerca e ripeti ^ R per scorrere i risultati.

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

+1 su md5sum. Mi piace l' md5sum -idea di usare come cercapersone. Non sei davvero specifico per te
serverhorror il

4

Trucchi che ho imparato che potrebbero essere utili ad alcuni:

Per eseguire il file precedentemente salvato:

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

Uso "\!" per accedere ai comandi della shell. Per esempio:

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

Quindi se vuoi scrivere la tua dichiarazione in un file (senza usare l'opzione editor) puoi inserire:

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

Se entri

\\T filename

le istruzioni e i risultati delle query verranno quindi indirizzati / stampati sul nome file specificato. Utilizzare \\tper disattivarlo.

Termina una query con \\Ganziché un ";" per mostrare l'output in un formato riga anziché in colonne.

Non escludere utilizzando una clausola Where ... LIKE con l'istruzione SHOW. Per esempio:

SHOW STATUS LIKE '%cache%';

Infine, per trovare la posizione della tua directory di dati MySQL senza guardare il my.cnffile usa:

SHOW VARIABLES LIKE 'datadir';

3

Personalmente mi piace il SHOWcomando

Potresti fare
SHOW PROCESSLIST- Per vedere tutte le connessioni in esecuzione a mysql
SHOW CREATE TABLE TableName- Per vedere il sql usato per creare la tabella
SHOW CREATE PROCEDURE ProcedureName- Per vedere il sql usato per creare il SP
SHOW VARIABLES- Per vedere tutte le variabili di sistema

Ottieni l'elenco completo qui


1
Sono un po 'perplesso dal fatto che elenchi comandi ben noti e documentati come SHOW ed EXPLAIN come "funzioni nascoste". Una funzione nascosta non è documentata?
John Gardeniers,

Bene, l'intenzione è quella di mettere in evidenza i comandi non così noti utili, cosa potrebbe essere ben noto a qualcuno potrebbe essere sconosciuto a qualcun altro, che dire?
Binoj Antony,

3

In realtà documentato , ma molto fastidioso: conversioni di date automatiche per dati errati.

Prima di MySQL 5.0.2, MySQL perdona valori di dati illegali o impropri e li obbliga a valori legali per l'inserimento dei dati. In MySQL 5.0.2 e versioni successive, questo rimane il comportamento predefinito, ma è possibile modificare la modalità SQL del server per selezionare un trattamento più tradizionale dei valori errati in modo tale che il server li rifiuti e interrompa l'istruzione in cui si verificano.

A volte sarai "fortunato" quando MySQL non adegua l'input alle date valide vicine, ma lo memorizza come 0000-00-00per definizione non valido. Tuttavia, anche allora potresti aver voluto che MySQL fallisse piuttosto che archiviare silenziosamente questo valore per te.


3

Un'altra funzione che distingue MySQL dagli altri database è il REPLACE INTOcomando. Tu puoi fare:

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

Puoi anche scrivere l'istruzione di sostituzione proprio come scrivi l'istruzione di aggiornamento:

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

1
REPLACE INTO è utile, ma va notato che esegue un controllo della chiave, ELIMINA se viene trovata una chiave corrispondente quindi infine INSERTs, che impiega molto più tempo di INSERT ... AL DUPLICATE KEY UPDATE
Andy

2

In realtà non è una funzione nascosta, ma è meno conosciuta e la uso molto per salvare facendo una query per verificare se esiste qualcosa prima di fare un AGGIORNAMENTO o INSERIRE

INSERT ... ON DUPLICATE KEY UPDATE

La documentazione è qui


1

Per visualizzare il piano di esecuzione della query, utilizzare EXPLAIN

per esempio

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

1

Non molto nascosto, ma il registro delle query lente può essere davvero utile per rintracciare la causa dei problemi di prestazioni nelle ore di punta.

Nel file my.cnf, sezione [mysqld] - aggiungi:

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


0

Proprio come un'aggiunta alla risposta di pQD (come noobie non sono ancora in grado di aggiungere un commento), se non hai ancora aggiunto il percorso al log delle query lente nel file my.cnf corretto, il log degli errori sarà scritto nella directory dei dati (usare MOSTRA VARIABILI COME 'datadir'; per scoprire dove si trova) e il nome del file sarà nel formato [nome sistema] -slow.log

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.