Fitur tersembunyi dari MySQL


15

Dalam tradisi panjang memiliki fitur tersembunyi, mari kita memiliki daftar fitur tersembunyi di MySQL.

Letakkan satu fitur per jawaban.

Juga Lihat:
Fitur Tersembunyi dari Linux
Fitur Tersembunyi dari PowerShell
Fitur tersembunyi dari Oracle Database
Fitur Tersembunyi dari Windows 2008
Fitur Tersembunyi dari Solaris / OpenSolaris
Fitur Tersembunyi dari SQL Server
Fitur Tersembunyi dari IIS (6.0 / 7.0)

Jawaban:


9

Yang sering tidak digunakan tetapi lebih banyak bertele-tele

TAMPILKAN PROSESLIS PENUH

berguna, tetapi tidak sebagus analisa permintaan non-perusahaan yang mengagumkan - aktifkan seperti itu

    mysql> set profiling = 1;
    Kueri OK, 0 baris terpengaruh (0,00 dtk)

Keduanya adalah permintaan sampah untuk mengisi tabel profil,

        
    mysql> select * from _test.customers;
    GALAT 1146 (42S02): Tabel '_test.customers' tidak ada

    mysql> pilih * dari batas test.customers 0;
    Set kosong (0,00 dtk)
    

Dapatkan daftar semua kueri yang diprofilkan dan durasinya

        
    mysql> tampilkan profil;
    + ---------- + ------------ + ------------------------- ------ +
    | Query_ID | Durasi | Pertanyaan |
    + ---------- + ------------ + ------------------------- ------ +
    | 1 | 0,00013400 | pilih * dari _test.customers |
    | 2 | 0,01546500 | pilih * dari test.customers |
    + ---------- + ------------ + ------------------------- ------ +

Tampilkan info untuk kueri terakhir hanya akan "tampilkan profil" - atau Anda dapat menentukan kueri

  
    mysql> tampilkan profil untuk kueri 2;
    + ---------------------- + ---------- +
    | Status | Durasi |
    + ---------------------- + ---------- +
    | mulai | 0,000053 |
    | memeriksa izin | 0,000007 |
    | Tabel pembukaan | 0,000014 |
    | Kunci sistem | 0,000006 |
    | Kunci meja | 0,000008 |
    | init | 0,000065 |
    | mengoptimalkan | 0,000003 |
    | mengeksekusi | 0,000201 |
    | akhir | 0,000003 |
    | permintaan akhir | 0,000002 |
    | membebaskan item | 0,000020 |
    | masuk kueri lambat | 0,000002 |
    | membersihkan | 0,000004 |
    + ---------------------- + ---------- +
    13 baris dalam set (0,00 dtk)

Anda juga dapat meminta info spesifik seperti CPU, BLOCK IO dan SWAPS antara lain ( semua di halaman manual )

  
    mysql> tampilkan cpu profil untuk kueri 2;
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | Status | Durasi | CPU_user | CPU_system |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    | mulai | 0,000056 | 0,001000 | 0,000000 |
    | memeriksa izin | 0,000007 | 0,000000 | 0,000000 |
    | Tabel pembukaan | 0,000010 | 0,000000 | 0,000000 |
    | Kunci sistem | 0,000005 | 0,000000 | 0,000000 |
    | Kunci meja | 0,000007 | 0,000000 | 0,000000 |
    | init | 0,000059 | 0,000000 | 0,000000 |
    | mengoptimalkan | 0,000003 | 0,000000 | 0,000000 |
    | statistik | 0,015022 | 0,000000 | 0,000000 |
    | mempersiapkan | 0,000014 | 0,001000 | 0,000000 |
    | mengeksekusi | 0,000004 | 0,000000 | 0,000000 |
    | Mengirim data | 0,000245 | 0,000000 | 0,000000 |
    | akhir | 0,000004 | 0,000000 | 0,000000 |
    | permintaan akhir | 0,000002 | 0,000000 | 0,000000 |
    | membebaskan item | 0,000021 | 0,000000 | 0,000000 |
    | masuk kueri lambat | 0,000002 | 0,000000 | 0,000000 |
    | membersihkan | 0,000004 | 0,000000 | 0,000000 |
    + ---------------------- + ---------- + ---------- + ---- -------- +
    16 baris dalam set (0,00 dtk)

Jangan lupa untuk menonaktifkannya setelah itu, karena logging menambahkan overhead.

  
    mysql> set profiling = 0;
    Kueri OK, 0 baris terpengaruh (0,00 dtk)

Anda juga dapat menggunakan SHOW PROFILE ALL FOR QUERY X untuk menampilkan semua data profil.
Kedare

8

Beberapa perintah MySQL yang tidak selalu dikenal atau diingat.

Ubah orientasi pengaturan hasil ke vertikal agar mudah dibaca dan ditempel.

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

Batalkan kueri yang sedang Anda ketikkan saat meninggalkannya dalam riwayat Anda.

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

Edit kueri atau kueri terakhir (masing-masing) dengan $ EDITOR favorit Anda.

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

Bersihkan output dari konsol.

mysql> \! clear

Bandingkan set hasil dengan hash MD5.

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

Ubah prompt Anda.

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

Cari riwayat perintah Anda untuk string yang diberikan (seperti Bash).
Mulai ketikkan istilah pencarian dan ulangi ^ R untuk menggilir hasil.

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

+1 pada md5sum. Saya suka md5sum -ide untuk digunakan sebagai pager. Tidak benar - benar khusus mysql
serverhorror

4

Trik yang saya pelajari yang mungkin berguna untuk beberapa:

Untuk menjalankan file yang sebelumnya Anda simpan:

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

Gunakan "\!" untuk mengakses perintah shell. Sebagai contoh:

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

Jadi, jika Anda ingin menulis pernyataan ke file (tanpa menggunakan opsi editor), Anda dapat memasukkan:

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

Jika kamu masuk

\\T filename

Anda kemudian akan mengarahkan laporan dan hasil kueri Anda diarahkan / dicetak ke nama file yang Anda tentukan. Gunakan \\tuntuk mematikan ini.

Hentikan permintaan dengan \\Galih - alih ";" untuk menampilkan output dalam format baris, bukan dalam kolom.

Jangan mengesampingkan penggunaan Di mana ... SUKA klausa dengan pernyataan SHOW. Sebagai contoh:

SHOW STATUS LIKE '%cache%';

Terakhir, untuk menemukan lokasi direktori data MySQL Anda tanpa melihat my.cnffile yang digunakan:

SHOW VARIABLES LIKE 'datadir';

3

Saya pribadi suka SHOWperintah itu

Anda bisa melakukan
SHOW PROCESSLIST- Untuk melihat semua koneksi yang sedang berjalan ke mysql
SHOW CREATE TABLE TableName- Untuk melihat sql yang digunakan untuk membuat tabel
SHOW CREATE PROCEDURE ProcedureName- Untuk melihat sql yang digunakan untuk membuat SP
SHOW VARIABLES- Untuk melihat semua variabel sistem

Dapatkan daftar lengkapnya di sini


1
Saya agak bingung dengan Anda daftar perintah tahu dan didokumentasikan dengan baik seperti SHOW dan MENJELASKAN sebagai "fitur tersembunyi". Bukankah fitur tersembunyi yang tidak didokumentasikan?
John Gardeniers

Maksudnya adalah untuk mengeluarkan perintah-perintah berguna yang tidak begitu terkenal, apa yang mungkin diketahui oleh seseorang mungkin tidak diketahui orang lain, bagaimana?
Binoj Antony

3

Sebenarnya didokumentasikan , tetapi sangat menjengkelkan: konversi tanggal otomatis untuk data yang salah.

Sebelum MySQL 5.0.2, MySQL memaafkan nilai data ilegal atau tidak benar dan memaksanya nilai hukum untuk entri data. Di MySQL 5.0.2 dan lebih tinggi, itu tetap merupakan perilaku default, tetapi Anda dapat mengubah mode SQL server untuk memilih perlakuan tradisional yang lebih buruk dari nilai-nilai sedemikian rupa sehingga server menolaknya dan membatalkan pernyataan di mana mereka muncul.

Terkadang Anda akan "beruntung" ketika MySQL tidak menyesuaikan input ke tanggal yang valid di dekatnya, tetapi menyimpannya 0000-00-00yang menurut definisi tidak valid. Namun, bahkan saat itu Anda mungkin ingin MySQL gagal daripada menyimpan nilai ini untuk Anda.


3

Fitur lain yang membedakan MySQL dari database lain adalah REPLACE INTOperintah. Anda dapat melakukan:

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

Anda juga dapat menulis pernyataan ganti seperti Anda menulis pernyataan pembaruan:

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

1
REPLACE INTO berguna, tetapi perlu dicatat itu melakukan pemeriksaan kunci, HAPUS jika ditemukan kunci yang cocok kemudian akhirnya INSERT, yang membutuhkan waktu lebih lama daripada INSERT ... PADA PEMBUATAN KUNCI DUPLIKASI
Andy

2

Tidak benar-benar fitur tersembunyi, tetapi kurang dikenal dan saya sering menggunakannya untuk menyimpan melakukan kueri untuk memeriksa apakah ada sesuatu sebelum melakukan UPDATE atau INSERT

INSERT ... ON DUPLICATE KEY UPDATE

Dokumentasi ada di sini


1

Untuk melihat rencana eksekusi permintaan gunakan EXPLAIN

misalnya

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

1

Tidak benar-benar tersembunyi, tetapi log permintaan lambat bisa sangat membantu dalam melacak penyebab masalah kinerja pada waktu puncak.

Dalam file my.cnf, bagian [mysqld] - tambahkan:

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


0

Sama seperti tambahan untuk jawaban pQD (sebagai noobie, saya belum dapat menambahkan komentar), jika Anda belum menambahkan path ke log kueri lambat dalam file my.cnf yang benar, log kesalahan akan menjadi ditulis ke direktori data (gunakan TUNJUKKAN VARIABEL SEPERTI 'datadir'; untuk mencari tahu di mana ini berada) dan nama file akan berada dalam format [systemname] -slow.log

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.