Ukryte funkcje MySQL

15

Zgodnie z długą tradycją posiadania ukrytych funkcji, mamy listę ukrytych funkcji w MySQL.

Umieść jedną funkcję na odpowiedź.

Zobacz także:
Ukryte funkcje Linux
Ukryte funkcje PowerShell
Ukryte funkcje Oracle Database
Ukryte funkcje Windows 2008
Ukryte funkcje Solaris / OpenSolaris
Ukryte funkcje SQL Server
Ukryte funkcje IIS (6.0 / 7.0)

Binoj Antony
źródło

Odpowiedzi:

9

Często nieużywany, ale bardziej szczegółowy

POKAŻ PEŁNĄ LISTĘ PROCESÓW

jest przydatny, ale nie tak dobry jak niesamowity analizator zapytań dla przedsiębiorstw - włącz tak

    mysql> ustaw profilowanie = 1;
    Zapytanie OK, dotyczy 0 wierszy (0,00 s)

Te dwa zapytania są śmieciami, które wypełniają tabelę profili,

        
    mysql> wybierz * z _test.customers;
    BŁĄD 1146 (42S02): Tabela „_test.customers” nie istnieje

    mysql> wybierz * z test.customers limit 0;
    Pusty zestaw (0,00 s)
    

Uzyskaj listę wszystkich zapytań profilowanych i ich czas trwania

        
    mysql> pokaż profile;
    + ---------- + ------------ + ------------------------- ------ +
    | Query_ID | Czas trwania | Zapytanie |
    + ---------- + ------------ + ------------------------- ------ +
    | 1 | 0,00013400 | wybierz * z _test.customers |
    | 2 | 0,01546500 | wybierz * z test.customers |
    + ---------- + ------------ + ------------------------- ------ +

Wyświetl informacje dla ostatniego zapytania to po prostu „pokaż profil” - lub możesz określić zapytanie

  
    mysql> pokaż profil dla zapytania 2;
    + ---------------------- + ---------- +
    | Status | Czas trwania |
    + ---------------------- + ---------- +
    | początek | 0,000053 |
    | sprawdzanie uprawnień | 0,000007 |
    | Otwieranie stołów | 0,000014 |
    | Blokada systemu | 0,000006 |
    | Blokada stołu | 0,000008 |
    | init | 0,000065 |
    | optymalizacja | 0,000003 |
    | wykonanie | 0,000201 |
    | koniec | 0,000003 |
    | koniec zapytania | 0,000002 |
    | uwalnianie przedmiotów | 0,000020 |
    | rejestrowanie powolnego zapytania | 0,000002 |
    | sprzątanie | 0,000004 |
    + ---------------------- + ---------- +
    13 rzędów w zestawie (0,00 s)

Możesz także zażądać między innymi określonych informacji, takich jak CPU, BLOCK IO i SWAPS ( wszystkie na stronie podręcznika )

  
    mysql> pokaż profil procesora dla zapytania 2;
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | Status | Czas trwania | Użytkownik_procesora | System_ CPU |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | początek | 0,000056 | 0,001000 | 0,000000 |
    | sprawdzanie uprawnień | 0,000007 | 0,000000 | 0,000000 |
    | Otwieranie stołów | 0,000010 | 0,000000 | 0,000000 |
    | Blokada systemu | 0,000005 | 0,000000 | 0,000000 |
    | Blokada stołu | 0,000007 | 0,000000 | 0,000000 |
    | init | 0,000059 | 0,000000 | 0,000000 |
    | optymalizacja | 0,000003 | 0,000000 | 0,000000 |
    | statystyki | 0,015022 | 0,000000 | 0,000000 |
    | przygotowywanie | 0,000014 | 0,001000 | 0,000000 |
    | wykonanie | 0,000004 | 0,000000 | 0,000000 |
    | Wysyłanie danych | 0,000245 | 0,000000 | 0,000000 |
    | koniec | 0,000004 | 0,000000 | 0,000000 |
    | koniec zapytania | 0,000002 | 0,000000 | 0,000000 |
    | uwalnianie przedmiotów | 0,000021 | 0,000000 | 0,000000 |
    | rejestrowanie powolnego zapytania | 0,000002 | 0,000000 | 0,000000 |
    | sprzątanie | 0,000004 | 0,000000 | 0,000000 |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    16 rzędów w zestawie (0,00 s)

Nie zapomnij go później wyłączyć, ponieważ rejestrowanie zwiększa koszty.

  
    mysql> ustaw profilowanie = 0;
    Zapytanie OK, dotyczy 0 wierszy (0,00 s)
Andy
źródło
możesz również użyć POKAŻ PROFIL WSZYSTKO DLA ZAPYTANIA X, aby wyświetlić wszystkie dane profilowania.
Kedare
8

Niektóre polecenia MySQL, które nie zawsze są powszechnie znane lub zapamiętywane.

Zmień orientację zestawu wyników na pionową, aby ułatwić czytanie i wklejanie.

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

Anuluj obecnie wpisywane zapytanie, pozostawiając je w swojej historii.

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

Edytuj zapytanie lub ostatnie zapytanie (odpowiednio) za pomocą ulubionego edytora $ EDITOR.

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

Wyczyść wyjście konsoli.

mysql> \! clear

Porównaj zestawy wyników według skrótu MD5.

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

Zmień swój monit.

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

Przeszukaj historię poleceń pod kątem określonego ciągu (np. Bash).
Zacznij wpisywać wyszukiwane hasło i powtórz ^ R, aby przewijać wyniki.

^R
(reverse-i-search)`DATE': SELECT CURDATE(), CURTIME();
Dan Carley
źródło
+1 na md5sum. Podoba mi się md5sum -pomysł używania go jako pagera. Niezupełnie specyficzny dla mysql
horror serwera
4

Nauczyłem się sztuczek, które mogą się przydać niektórym:

Aby uruchomić wcześniej zapisany plik:

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

Posługiwać się "\!" aby uzyskać dostęp do poleceń powłoki. Na przykład:

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

Więc jeśli chcesz zapisać swoją instrukcję do pliku (bez użycia opcji edytora), możesz wpisać:

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

Jeśli wejdziesz

\\T filename

następnie twoje instrukcje i wyniki zapytań zostaną skierowane / wydrukowane na podaną nazwę pliku. Użyj, \\taby to wyłączyć.

Zakończ zapytanie za pomocą \\Gzamiast „;” w celu wyświetlenia wyniku w formacie wiersza zamiast w kolumnach.

Nie wykluczaj stosowania klauzuli Where ... LIKE z instrukcją SHOW. Na przykład:

SHOW STATUS LIKE '%cache%';

Wreszcie, aby znaleźć lokalizację katalogu danych MySQL bez patrzenia na my.cnfplik, użyj:

SHOW VARIABLES LIKE 'datadir';
DBMarcos99
źródło
3

Osobiście podoba mi się SHOWpolecenie

Możesz zrobić
SHOW PROCESSLIST- Aby zobaczyć wszystkie działające połączenia z mysql
SHOW CREATE TABLE TableName- Aby zobaczyć sql użyty do utworzenia tabeli
SHOW CREATE PROCEDURE ProcedureName- Aby zobaczyć sql użyty do utworzenia SP
SHOW VARIABLES- Aby zobaczyć wszystkie zmienne systemowe

Pobierz pełną listę tutaj

Binoj Antony
źródło
1
Jestem trochę zaskoczony, że wymieniasz dobrze znane i udokumentowane polecenia, takie jak POKAŻ i WYJAŚNIJ, jako „ukryte funkcje”. Czy funkcja ukryta nie jest dokumentowana?
John Gardeniers,
Cóż, chodzi o to, aby wydać mało znane przydatne polecenia, co może być dobrze znane komuś, może być nieznane komuś innemu, co powiedzieć?
Binoj Antony,
3

Faktycznie udokumentowane , ale bardzo denerwujące: automatyczne konwersje daty dla niepoprawnych danych.

W wersjach wcześniejszych niż MySQL 5.0.2 MySQL wybacza nielegalne lub niewłaściwe wartości danych i zmusza je do legalnych wartości do wprowadzania danych. W MySQL 5.0.2 i nowszych pozostaje to zachowanie domyślne, ale można zmienić tryb serwera SQL, aby wybrać bardziej tradycyjne traktowanie złych wartości, tak aby serwer je odrzucił i przerwał instrukcję, w której występują.

Czasami będziesz miał szczęście, gdy MySQL nie dostosuje danych wejściowych do pobliskich ważnych dat, ale zamiast tego zapisze je jako takie, 0000-00-00które z definicji są nieprawidłowe. Jednak nawet wtedy mógłbyś chcieć, aby MySQL zawiódł, zamiast dyskretnie przechowywać tę wartość dla ciebie.

Arjan
źródło
3

Kolejną cechą, która odróżnia MySQL od innych baz danych, jest REPLACE INTOpolecenie. Możesz to zrobić:

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

Możesz także napisać instrukcję replace, tak jak piszesz instrukcję aktualizacji:

REPLACE INTO T1 
SET Col1 = 'SomeValue1'
, Col2   = 'SomeValue2'
Binoj Antony
źródło
1
REPLACE INTO jest użyteczne, ale należy zauważyć, że wykonuje sprawdzenie klucza, USUWA, jeśli zostanie znaleziony pasujący klucz, to w końcu WSTAWIA, co trwa znacznie dłużej niż WSTAWIANIE ... W DUPLIKACJI AKTUALIZACJI KLUCZA
Andy
2

Naprawdę nie jest to ukryta funkcja, ale jest mniej znana i używam jej często, aby zaoszczędzić, wykonując zapytanie, aby sprawdzić, czy coś istnieje przed wykonaniem UPDATE lub INSERT

INSERT ... ON DUPLICATE KEY UPDATE

Dokumentacja jest tutaj

Paul Dixon
źródło
1

Aby zobaczyć plan wykonania zapytania, użyj EXPLAIN

na przykład

EXPLAIN 
SELECT T1.Col1, T2.Col2
FROM T1 INNER JOIN T2 ON T1.Id = T2.Id
WHERE T1.Col3 = 10
Binoj Antony
źródło
1

Nie bardzo ukryte, ale dziennik spowolnionych zapytań może być naprawdę pomocny w śledzeniu przyczyn problemów z wydajnością w godzinach szczytu.

W pliku my.cnfsekcja [mysqld] - dodaj:

log_slow_queries=/var/log/mysql/mysql-slow.log
# log queries that took more than 1 sec
long_query_time = 1
pQd
źródło
0

Jako dodatek do odpowiedzi pQD (jako noobie nie jestem jeszcze w stanie dodać komentarza), jeśli jeszcze nie dodałeś ścieżki do dziennika powolnych zapytań w poprawnym pliku my.cnf, dziennik błędów będzie zapisany w katalogu danych (użyj SHOW VARIABLES LIKE 'datadir'; aby dowiedzieć się, gdzie to jest), a nazwa pliku będzie miała format [nazwa systemu] -slow.log

DBMarcos99
źródło