Versteckte Funktionen von MySQL

15

In der langen Tradition von versteckten Funktionen haben wir eine Liste von versteckten Funktionen in MySQL.

Fügen Sie pro Antwort ein Feature ein.

Siehe auch:
Versteckte Funktionen von Linux
Versteckte Funktionen von PowerShell
Versteckte Funktionen von Oracle Database
Versteckte Funktionen von Windows 2008
Versteckte Funktionen von Solaris / OpenSolaris
Versteckte Funktionen von SQL Server
Versteckte Funktionen von IIS (6.0 / 7.0)

Binoj Antony
quelle

Antworten:

9

Eine oft ungenutzte, aber ausführlichere

VOLLSTÄNDIGE PROZESSLISTE ANZEIGEN

ist praktisch, aber nicht so gut wie der fantastische Query Analyzer für Nicht-Unternehmen - aktivieren Sie es so

    mysql> set profiling = 1;
    Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)

Diese beiden sind Junk-Abfragen, um die Profiltabelle zu füllen,

        
    mysql> wähle * aus _test.customers;
    FEHLER 1146 (42S02): Tabelle '_test.customers' existiert nicht

    mysql> wähle * aus test.customers limit 0;
    Leerer Satz (0,00 Sek.)
    

Rufen Sie eine Liste aller Abfragen mit Profil und ihrer Dauer ab

        
    mysql> show profiles;
    + ---------- + ------------ + ------------------------- ------ +
    | Query_ID | Dauer | Abfrage |
    + ---------- + ------------ + ------------------------- ------ +
    | 1 | 0,00013400 | Wählen Sie * aus _test.customers |
    | 2 | 0,01546500 | Wählen Sie * aus test.customers |
    + ---------- + ------------ + ------------------------- ------ +

Anzeigeinfo für die letzte Abfrage wäre nur "Profil anzeigen" - oder Sie können eine Abfrage angeben

  
    mysql> zeige Profil für Abfrage 2;
    + ---------------------- + ---------- +
    | Status | Dauer |
    + ---------------------- + ---------- +
    | starten | 0,000053 |
    | Berechtigungen prüfen | 0,000007 |
    | Tische öffnen | 0,000014 |
    | Systemsperre | 0,000006 |
    | Tischschloss | 0,000008 |
    | init | 0,000065 |
    | optimieren | 0,000003 |
    | ausführen | 0.000201 |
    | ende | 0,000003 |
    | Abfrageende | 0,000002 |
    | Gegenstände befreien 0,000020 |
    | langsame Abfrage protokollieren | 0,000002 |
    | aufräumen 0,000004 |
    + ---------------------- + ---------- +
    13 Zeilen im Satz (0,00 Sek.)

Sie können auch spezifische Informationen wie CPU, BLOCK IO und SWAPS anfordern ( alles auf der Manpage ).

  
    mysql> show profile cpu for query 2;
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | Status | Dauer | CPU_user | CPU_system |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | starten | 0,000056 | 0,001000 | 0,000000 |
    | Berechtigungen prüfen | 0,000007 | 0,000000 | 0,000000 |
    | Tische öffnen | 0,000010 | 0,000000 | 0,000000 |
    | Systemsperre | 0,000005 | 0,000000 | 0,000000 |
    | Tischschloss | 0,000007 | 0,000000 | 0,000000 |
    | init | 0,000059 | 0,000000 | 0,000000 |
    | optimieren | 0,000003 | 0,000000 | 0,000000 |
    | Statistiken | 0,015022 | 0,000000 | 0,000000 |
    | vorbereiten 0,000014 | 0,001000 | 0,000000 |
    | ausführen | 0,000004 | 0,000000 | 0,000000 |
    | Daten senden | 0,000245 | 0,000000 | 0,000000 |
    | ende | 0,000004 | 0,000000 | 0,000000 |
    | Abfrageende | 0,000002 | 0,000000 | 0,000000 |
    | Gegenstände befreien 0,000021 | 0,000000 | 0,000000 |
    | langsame Abfrage protokollieren | 0,000002 | 0,000000 | 0,000000 |
    | aufräumen 0,000004 | 0,000000 | 0,000000 |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    16 Zeilen im Satz (0,00 Sek.)

Vergessen Sie nicht, es anschließend zu deaktivieren, da die Protokollierung zusätzlichen Aufwand verursacht.

  
    mysql> set profiling = 0;
    Abfrage OK, 0 Zeilen betroffen (0,00 Sek.)
Andy
quelle
Sie können auch SHOW PROFILE ALL FOR QUERY X verwenden, um alle Profildaten anzuzeigen.
Kedare,
8

Einige MySQL-Befehle , die nicht immer allgemein bekannt sind oder in Erinnerung bleiben.

Ändern Sie die Ausrichtung der Ergebnismenge in vertikal, um das Lesen und Einfügen zu erleichtern.

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

Brechen Sie die Abfrage ab, die Sie gerade eingeben, während Sie sie in Ihrem Verlauf belassen.

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

Bearbeiten Sie eine Abfrage bzw. die letzte Abfrage mit Ihrem bevorzugten $ EDITOR.

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

Löschen Sie die Ausgabe der Konsole.

mysql> \! clear

Vergleichen Sie die Ergebnismengen mit MD5-Hash.

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

Ändern Sie Ihre Eingabeaufforderung.

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

Durchsuchen Sie Ihren Befehlsverlauf nach einer bestimmten Zeichenfolge (z. B. Bash).
Beginnen Sie mit der Eingabe eines Suchbegriffs und wiederholen Sie ^ R, um durch die Ergebnisse zu blättern.

^R
(reverse-i-search)`DATE': SELECT CURDATE(), CURTIME();
Dan Carley
quelle
+1 auf md5sum. Ich mag die md5sum -Idee, als Pager zu verwenden. Nicht wirklich mysql-spezifisch du
Serverhorror
4

Von mir erlernte Tricks, die für einige von Nutzen sein können:

So führen Sie die zuvor gespeicherte Datei aus:

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

Verwenden "\!" um auf Shell-Befehle zuzugreifen. Beispielsweise:

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

Wenn Sie also Ihre Anweisung in eine Datei schreiben möchten (ohne die Editor-Option zu verwenden), können Sie Folgendes eingeben:

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

Wenn Sie eintreten

\\T filename

Anschließend werden Ihre Anweisungen und Abfrageergebnisse an den von Ihnen angegebenen Dateinamen weitergeleitet / gedruckt. Verwenden Sie \\tdiese auszuschalten.

Beenden Sie eine Abfrage mit \\Geinem ";" um die Ausgabe in einem Zeilenformat statt in Spalten anzuzeigen.

Schließen Sie die Verwendung einer Where ... LIKE-Klausel mit der SHOW-Anweisung nicht aus. Beispielsweise:

SHOW STATUS LIKE '%cache%';

Um den Speicherort Ihres MySQL-Datenverzeichnisses zu ermitteln, ohne auf die my.cnfDatei zu achten, gehen Sie wie folgt vor :

SHOW VARIABLES LIKE 'datadir';
DBMarcos99
quelle
3

Ich persönlich mag den SHOWBefehl

Sie können Folgendes tun:
SHOW PROCESSLIST- Alle laufenden Verbindungen zu
SHOW CREATE TABLE TableNamemysql anzeigen. - Den zum Erstellen der Tabelle
SHOW CREATE PROCEDURE ProcedureNameverwendeten SQL-Code anzeigen. - Den zum Erstellen des SP verwendeten SQL-Code anzeigen.
SHOW VARIABLES- Alle Systemvariablen anzeigen

Die vollständige Liste finden Sie hier

Binoj Antony
quelle
1
Ich bin ein bisschen verwirrt darüber, dass Sie bekannte und dokumentierte Befehle wie SHOW und EXPLAIN als "versteckte Funktionen" auflisten. Ist eine versteckte Funktion nicht dokumentiert?
John Gardeniers
Nun, die Absicht ist es, die nicht so bekannten nützlichen Befehle herauszubringen, was einem vielleicht bekannt ist, ist jemand anderem vielleicht unbekannt, was sagt man?
Binoj Antony
3

Eigentlich dokumentiert , aber sehr ärgerlich: Automatische Datumskonvertierungen für falsche Daten.

Vor MySQL 5.0.2 vergibt MySQL unzulässige oder unzulässige Datenwerte und zwingt diese zur Dateneingabe auf zulässige Werte. In MySQL 5.0.2 und höher bleibt dies das Standardverhalten, aber Sie können den Server-SQL-Modus ändern, um eine traditionellere Behandlung von fehlerhaften Werten auszuwählen, sodass der Server sie ablehnt und die Anweisung abbricht, in der sie auftreten.

Manchmal haben Sie "Glück", wenn MySQL die Eingabe nicht an nahegelegene gültige Daten anpasst, sondern sie als 0000-00-00ungültig speichert . Selbst dann hätten Sie vielleicht gewollt, dass MySQL fehlschlägt, anstatt diesen Wert stillschweigend für Sie zu speichern.

Arjan
quelle
3

Ein weiteres Merkmal, das MySQL von anderen Datenbanken unterscheidet, ist der REPLACE INTOBefehl. Du kannst tun:

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

Sie können die Ersetzungsanweisung auch so schreiben, wie Sie die Aktualisierungsanweisung schreiben:

REPLACE INTO T1 
SET Col1 = 'SomeValue1'
, Col2   = 'SomeValue2'
Binoj Antony
quelle
1
REPLACE INTO ist nützlich, aber es sollte beachtet werden, dass es eine Schlüsselüberprüfung durchführt, DELETEs, wenn ein passender Schlüssel gefunden wird, dann INSERTs, was viel länger dauert als INSERT ... ON DUPLICATE KEY UPDATE
Andy
2

Nicht wirklich ein verstecktes Feature, aber es ist weniger bekannt und ich benutze es oft, um eine Abfrage zu speichern, um zu überprüfen, ob etwas existiert, bevor ich ein UPDATE oder INSERT mache

INSERT ... ON DUPLICATE KEY UPDATE

Dokumentation ist hier

Paul Dixon
quelle
1

Verwenden Sie zum Anzeigen des Abfrageausführungsplans EXPLAIN

z.B

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

Nicht wirklich versteckt, aber Slow-Query-Log kann sehr hilfreich sein, um Leistungsprobleme in Spitzenzeiten aufzuspüren.

In der Datei my.cnf, Abschnitt [mysqld] - fügen Sie hinzu:

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

Nur als Ergänzung zur Antwort von pQD (als Anfänger kann ich noch keinen Kommentar hinzufügen), wenn Sie den Pfad zum langsamen Abfrageprotokoll in der richtigen my.cnf-Datei noch nicht hinzugefügt haben, wird das Fehlerprotokoll angezeigt In das Datenverzeichnis geschrieben (verwenden Sie SHOW VARIABLES LIKE 'datadir', um herauszufinden, wo sich dies befindet). Der Dateiname hat das Format [Systemname] -slow.log

DBMarcos99
quelle