Ini adalah perintah pt-index-usagep yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa stasiun kerja online gratis kami seperti Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS
PROGRAM:
NAMA
pt-index-usage - Baca kueri dari log dan analisis cara mereka menggunakan indeks.
RINGKASAN
Penggunaan: pt-index-usage [OPTIONS] [FILES]
pt-index-usage membaca kueri dari log dan menganalisis cara mereka menggunakan indeks.
Analisis kueri di slow.log dan cetak laporan:
pt-index-usage /path/to/slow.log --Host localhost
Nonaktifkan laporan dan simpan hasil ke database percona untuk analisis nanti:
pt-index-usage slow.log --no-report --save-results-database percona
RISIKO
Percona Toolkit sudah matang, terbukti di dunia nyata, dan teruji dengan baik, tetapi semua basis data
alat dapat menimbulkan risiko bagi sistem dan server database. Sebelum menggunakan alat ini,
mohon untuk:
· Baca dokumentasi alat ini
· Tinjau "BUGS" alat yang dikenal
· Uji alat di server non-produksi
· Cadangkan server produksi Anda dan verifikasi cadangannya
DESKRIPSI
Alat ini terhubung ke server database MySQL, membaca log kueri, dan menggunakan EXPLAIN
untuk menanyakan MySQL bagaimana ia akan menggunakan setiap kueri. Setelah selesai, ia mencetak laporan tentang
indeks yang tidak digunakan kueri.
Log kueri harus dalam format log kueri lambat MySQL. Jika Anda perlu memasukkan
format yang berbeda, Anda dapat menggunakan pt-query-digest untuk menerjemahkan format. Jika tidak
tentukan nama file, alat membaca dari STDIN.
Alat ini menjalankan dua tahap. Pada tahap pertama, alat ini menginventarisasi semua tabel
dan indeks di database Anda, sehingga dapat membandingkan indeks yang ada dengan yang sebelumnya
sebenarnya digunakan oleh kueri di log. Pada tahap kedua, ini menjalankan EXPLAIN pada masing-masing
kueri dalam log kueri. Ini menggunakan koneksi database terpisah untuk menginventarisasi tabel dan
jalankan EXPLAIN, sehingga membuka dua koneksi ke database.
Jika kueri bukan SELECT, kueri itu mencoba mengubahnya menjadi kueri SELECT yang kira-kira setara
sehingga dapat DIJELASKAN. Ini bukan proses yang sempurna, tetapi cukup baik untuk menjadi
berguna.
Alat ini melewatkan langkah JELASKAN untuk kueri yang merupakan duplikat persis dari yang terlihat
sebelum. Diasumsikan bahwa kueri yang sama akan menghasilkan rencana EXPLAIN yang sama seperti sebelumnya
sebelumnya (biasanya asumsi yang aman, dan umumnya baik untuk kinerja), dan hanya
menambah hitungan berapa kali indeks digunakan. Namun, pertanyaan yang memiliki
sidik jari yang sama tetapi checksum yang berbeda akan DIJELASKAN kembali. Pertanyaan yang memiliki
konstanta literal yang berbeda dapat memiliki rencana eksekusi yang berbeda, dan ini penting untuk
mengukur.
Setelah MENJELASKAN kueri, perlu untuk mencoba memetakan kembali alias dalam kueri ke
nama tabel aslinya. Misalnya, pertimbangkan paket EXPLAIN untuk kueri berikut:
PILIH * DARI tbl1 SEBAGAI foo;
Output EXPLAIN akan menampilkan akses ke tabel "foo", dan itu harus diterjemahkan kembali ke
"tbl1". Proses ini melibatkan penguraian yang kompleks. Ini umumnya sangat akurat, tetapi ada
adalah beberapa kemungkinan bahwa itu mungkin tidak berfungsi dengan benar. Jika Anda menemukan kasus di mana gagal, kirimkan a
laporan bug dan kasus uji yang dapat direproduksi.
Query yang tidak dapat DIJELASKAN akan menyebabkan semua query berikutnya dengan hal yang sama
sidik jari yang akan masuk daftar hitam. Ini untuk mengurangi pekerjaan yang mereka timbulkan, dan mencegahnya
dari melanjutkan untuk mencetak pesan kesalahan. Namun, setidaknya dalam tahap alat ini
pengembangan, menurut saya bukanlah ide yang baik untuk membungkam ini terlebih dahulu, atau
mencegah mereka dari DIJELASKAN sama sekali. Saya mencari banyak umpan balik tentang cara
meningkatkan hal-hal seperti penguraian kueri. Jadi, silakan kirimkan kasus uji Anda berdasarkan
kesalahan yang dicetak alat!
KELUARAN
Setelah membaca semua kejadian di log, alat mencetak pernyataan DROP untuk setiap
indeks yang tidak digunakan. Itu melewatkan indeks untuk tabel yang tidak pernah diakses oleh siapa pun
kueri di log, untuk menghindari hasil positif palsu.
Jika Anda tidak menentukan "--quiet", alat ini juga mengeluarkan peringatan tentang pernyataan yang
tidak dapat DIJELASKAN dan serupa. Ini pergi ke kesalahan standar.
Laporan kemajuan diaktifkan secara default (lihat "--progres"). Ini juga masuk ke standar
kesalahan.
PILIHAN
Alat ini menerima argumen baris perintah tambahan. Lihat "SINOPSIS" dan penggunaan
informasi untuk rincian.
--ask-lulus
Meminta kata sandi saat menghubungkan ke MySQL.
--rangkaian karakter
bentuk pendek: -A; jenis: string
Kumpulan karakter default. Jika nilainya utf8, setel binmode Perl di STDOUT ke utf8,
meneruskan opsi mysql_enable_utf8 ke DBD::mysql, dan menjalankan SET NAMES UTF8 setelahnya
menghubungkan ke MySQL. Nilai lain apa pun menetapkan binmode pada STDOUT tanpa lapisan utf8,
dan menjalankan SET NAMES setelah terhubung ke MySQL.
--konfigurasi
jenis: Array
Baca daftar file konfigurasi yang dipisahkan koma ini; jika ditentukan, ini harus menjadi yang pertama
pilihan pada baris perintah.
--buat-simpan-hasil-database
Buat "--save-results-database" jika tidak ada.
Jika "--save-results-database" sudah ada dan opsi ini ditentukan,
database digunakan dan tabel yang diperlukan dibuat jika belum ada.
--[no]buat-tampilan
Buat tampilan untuk kueri contoh "--save-results-database".
Beberapa contoh kueri diberikan untuk kueri tabel di
"--simpan-hasil-database". Contoh kueri ini, secara default, dibuat sebagai tampilan.
Menentukan "--no-create-views" mencegah tampilan ini dibuat.
--basis data
bentuk pendek: -D; jenis: string
Database yang akan digunakan untuk koneksi.
--database
bentuk pendek: -d; jenis: hash
Hanya dapatkan tabel dan indeks dari daftar database yang dipisahkan koma ini.
--database-regex
jenis: string
Hanya dapatkan tabel dan indeks dari database yang namanya cocok dengan regex Perl ini.
--default-file
bentuk pendek: -F; jenis: string
Hanya baca opsi mysql dari file yang diberikan. Anda harus memberikan nama path absolut.
--menjatuhkan
jenis: Hash; default: tidak unik
Sarankan untuk hanya menghapus jenis indeks yang tidak digunakan ini.
Secara default pt-index-usage hanya akan menyarankan untuk menghapus indeks sekunder yang tidak digunakan, bukan
indeks utama atau unik. Anda dapat menentukan jenis indeks yang tidak digunakan alat
menyarankan untuk menjatuhkan: utama, unik, tidak unik, semua.
Pernyataan "ALTER TABLE" terpisah untuk setiap jenis dicetak. Jadi jika Anda menentukan
"--drop all" dan ada kunci utama dan indeks non-unik, "ALTER TABLE ...
DROP" untuk masing-masing akan dicetak pada baris terpisah.
--kosong-simpan-hasil-tabel
Jatuhkan dan buat kembali semua tabel yang sudah ada sebelumnya di "--save-results-database". Ini
memungkinkan informasi dari proses sebelumnya dihapus sebelum proses saat ini.
--membantu
Tunjukkan bantuan dan keluar.
--tuan rumah
bentuk pendek: -h; jenis: string
Hubungkan ke tuan rumah.
--abaikan-database
jenis: Hash
Abaikan daftar database yang dipisahkan koma ini.
--ignore-database-regex
jenis: string
Abaikan database yang namanya cocok dengan regex Perl ini.
--ignore-tabel
jenis: Hash
Abaikan daftar nama tabel yang dipisahkan koma ini.
Nama tabel mungkin dikualifikasikan dengan nama database.
--abaikan-tabel-regex
jenis: string
Abaikan tabel yang namanya cocok dengan regex Perl.
--kata sandi
bentuk pendek: -p; jenis: string
Kata sandi untuk digunakan saat menghubungkan. Jika kata sandi mengandung koma, mereka harus diloloskan
dengan garis miring terbalik: "ujian\,ple"
--Pelabuhan
bentuk pendek: -P; jenis: int
Nomor port yang digunakan untuk koneksi.
--kemajuan
jenis: susunan; default: waktu, 30
Cetak laporan kemajuan ke STDERR. Nilainya adalah daftar yang dipisahkan koma dengan dua bagian.
Bagian pertama dapat berupa persentase, waktu, atau iterasi; bagian kedua menentukan caranya
seringkali pembaruan harus dicetak, dalam persentase, detik, atau jumlah iterasi.
--diam
bentuk pendek: -q
Jangan cetak peringatan apa pun. Juga menonaktifkan "--progress".
--[tidak]melaporkan
default: ya
Cetak laporan untuk "--report-format".
Anda mungkin ingin menonaktifkan laporan dengan menentukan "--no-report" jika, misalnya, Anda
juga tentukan "--save-results-database" dan Anda hanya ingin menanyakan tabel hasil
nanti.
--format-laporan
jenis: Array; default: drop_unused_indexes
Saat ini hanya ada satu laporan: drop_unused_indexes. Laporan ini mencetak SQL
pernyataan untuk menjatuhkan indeks yang tidak digunakan. Lihat juga "--jatuhkan".
Lihat juga "--[tidak]laporan".
--simpan-hasil-database
jenis: DSN
Simpan hasil ke tabel dalam database ini. Informasi tentang indeks, kueri, tabel
dan penggunaannya disimpan dalam beberapa tabel dalam database yang ditentukan. Meja-meja tersebut adalah
dibuat otomatis jika tidak ada. Jika database tidak ada, bisa otomatis
dibuat dengan "--create-save-results-database". Dalam hal ini hubungannya adalah
awalnya dibuat tanpa database default, kemudian setelah database dibuat, itu adalah
DIGUNAKAN.
pt-index-usage mengeksekusi pernyataan INSERT untuk menyimpan hasil. Oleh karena itu, Anda harus
hati-hati jika Anda menggunakan fitur ini di server produksi. Mungkin menambah beban, atau
menyebabkan masalah jika Anda tidak ingin server tersebut ditulisi, atau sebagainya.
Ini adalah fitur baru. Ini mungkin berubah di rilis mendatang.
Setelah dijalankan, Anda dapat menanyakan tabel penggunaan untuk menjawab berbagai pertanyaan tentang indeks
penggunaan. Tabel memiliki definisi CREATE TABLE sebagai berikut:
MAGIC_create_indexes:
BUAT TABEL JIKA TIDAK ADA indeks (
db Varchar(64) TIDAK NULL,
tbl Varchar(64) TIDAK NULL,
idx Varchar(64) TIDAK NULL,
cnt BIGINT UNSIGNED BUKAN NULL DEFAULT 0,
KUNCI UTAMA (db, tbl, idx)
)
MAGIC_create_queries:
BUAT TABEL JIKA TIDAK ADA kueri (
query_id BIGINT TIDAK DITANDA TANGANI TIDAK NULL,
TEKS sidik jari TIDAK NULL,
contoh TEKS NOT NULL,
KUNCI UTAMA (query_id)
)
MAGIC_buat_tabel:
BUAT TABEL JIKA TIDAK ADA tabel (
db Varchar(64) TIDAK NULL,
tbl Varchar(64) TIDAK NULL,
cnt BIGINT UNSIGNED BUKAN NULL DEFAULT 0,
KUNCI UTAMA (db, tbl)
)
MAGIC_create_index_usage:
BUAT TABEL JIKA TIDAK ADA index_usage (
query_id BIGINT TIDAK DITANDA TANGANI TIDAK NULL,
db Varchar(64) TIDAK NULL,
tbl Varchar(64) TIDAK NULL,
idx Varchar(64) TIDAK NULL,
cnt BIGINT UNSIGNED BUKAN NULL DEFAULT 1,
INDEKS UNIK (query_id, db, tbl, idx)
)
MAGIC_create_index_alternatives:
BUAT TABEL JIKA TIDAK ADA index_alternatives (
query_id BIGINT UNSIGNED NOT NULL, -- Permintaan ini digunakan
db Varchar(64) NOT NULL, -- indeks ini, tapi...
tbl Varchar(64) TIDAK NULL, --
idx Varchar(64) TIDAK NULL, --
alt_idx Varchar(64) NOT NULL, -- adalah sebuah alternatif
cnt BIGINT UNSIGNED BUKAN NULL DEFAULT 1,
INDEKS UNIK (query_id, db, tbl, idx, alt_idx),
INDEKS (db, tbl, idx),
INDEKS (db, tbl, alt_idx)
)
Berikut ini adalah beberapa pertanyaan yang dapat Anda jalankan terhadap tabel ini untuk menjawab pertanyaan umum
pertanyaan yang mungkin Anda miliki. Setiap kueri juga dibuat sebagai tampilan (dengan MySQL v5.0 dan
lebih baru) jika "--[no]create-views" benar (secara default). Nama tampilan adalah
string setelah awalan "MAGIC_view_".
Pertanyaan: kueri mana yang terkadang menggunakan indeks berbeda, dan berapa lama waktunya
adalah setiap indeks yang dipilih? MAGIC_view_query_uses_several_indexes:
PILIH iu.query_id, CONCAT_WS('.', iu.db, iu.tbl, iu.idx) SEBAGAI idx,
variasi, iu.cnt, iu.cnt / total_cnt * 100 AS persen
DARI index_usage AS iu
GABUNG DALAM (
PILIH query_id, db, tbl, SUM(cnt) AS total_cnt,
COUNT(*) SEBAGAI variasi
DARI index_usage
KELOMPOK MENURUT query_id, db, tbl
MEMILIKI JUMLAH(*) > 1
) AS qv MENGGUNAKAN(query_id, db, tbl);
Pertanyaan: indeks mana yang memiliki banyak alternatif, yaitu dipilih daripada yang lain
indeks, dan untuk pertanyaan apa? MAGIC_view_index_has_alternate:
PILIH CONCAT_WS('.', db, tbl, idx) SEBAGAI idx_chosen,
GROUP_CONCAT(DISTINCT alt_idx) SEBAGAI alternatif,
GROUP_CONCAT(DISTINCT query_id) SEBAGAI kueri, SUM(cnt) SEBAGAI cnt
DARI index_alternatives
KELOMPOK MENURUT db, tbl, idx
MEMILIKI JUMLAH(*) > 1;
Pertanyaan: indeks mana yang dianggap sebagai pengganti indeks lain, dan untuk apa?
pertanyaan? MAGIC_view_index_alternate:
PILIH CONCAT_WS('.', db, tbl, alt_idx) SEBAGAI idx_considered,
GROUP_CONCAT(IDX BERBEDA) SEBAGAI alternatif_untuk,
GROUP_CONCAT(DISTINCT query_id) SEBAGAI kueri, SUM(cnt) SEBAGAI cnt
DARI index_alternatives
KELOMPOK BERDASARKAN db, tbl, alt_idx
MEMILIKI JUMLAH(*) > 1;
Pertanyaan: mana dari mereka yang tidak pernah dipilih oleh pertanyaan apa pun, dan karena itu
tak berguna? MAGIC_view_unused_index_alternate:
PILIH CONCAT_WS('.', i.db, i.tbl, i.idx) SEBAGAI idx,
alt.alternatif_to, alt.kueri, alt.cnt
DARI indeks AS i
GABUNG DALAM (
PILIH db, tbl, alt_idx, GROUP_CONCAT(DISTINCT idx) SEBAGAI alternative_to,
GROUP_CONCAT(DISTINCT query_id) SEBAGAI kueri, SUM(cnt) SEBAGAI cnt
DARI index_alternatives
KELOMPOK BERDASARKAN db, tbl, alt_idx
MEMILIKI JUMLAH(*) > 1
) SEBAGAI alt PADA i.db = alt.db DAN i.tbl = alt.tbl
DAN i.idx = alt.alt_idx
DI MANA i.cnt = 0;
Pertanyaan: diberi tabel, indeks mana yang digunakan, berapa banyak kueri, dengan berapa banyak
sidik jari yang berbeda? Apakah ada alternatif? Indeks mana yang tidak digunakan? Anda
dapat mengedit daftar SELECT kueri berikut untuk juga melihat ID kueri yang dimaksud.
MAGIC_view_index_penggunaan:
PILIH i.idx, iu.usage_cnt, iu.usage_total,
ia.alt_cnt, ia.alt_total
DARI indeks AS i
GABUNG LUAR KIRI (
PILIH db, tbl, idx, COUNT(*) AS usage_cnt,
SUM(cnt) AS penggunaan_total, GROUP_CONCAT(query_id) AS digunakan_oleh
DARI index_usage
KELOMPOK MENURUT db, tbl, idx
) AS iu DI i.db=iu.db AND i.tbl=iu.tbl AND i.idx = iu.idx
GABUNG LUAR KIRI (
PILIH db, tbl, idx, COUNT(*) AS alt_cnt,
SUM(cnt) SEBAGAI alt_total,
GROUP_CONCAT(query_id) SEBAGAI alt_queries
DARI index_alternatives
KELOMPOK MENURUT db, tbl, idx
) SEPERTI DI i.db=ia.db DAN i.tbl=ia.tbl DAN i.idx = ia.idx;
Pertanyaan: indeks mana pada tabel tertentu yang vital untuk setidaknya satu kueri (tidak ada
alternatif)? MAGIC_view_required_indexes:
PILIH i.db, i.tbl, i.idx, no_alt.queries
DARI indeks AS i
GABUNG DALAM (
PILIH iu.db, iu.tbl, iu.idx,
GROUP_CONCAT(iu.query_id) SEBAGAI kueri
DARI index_usage AS iu
KIRI LUAR GABUNG index_alternatives AS ia
MENGGUNAKAN (db, tbl, idx)
DI MANA ia.db NULL
KELOMPOK OLEH iu.db, iu.tbl, iu.idx
) SEBAGAI no_alt PADA no_alt.db = i.db DAN no_alt.tbl = i.tbl
DAN no_alt.idx = i.idx
ORDER OLEH i.db, i.tbl, i.idx, no_alt.queries;
--set-vars
jenis: Array
Setel variabel MySQL dalam daftar pasangan "variabel=nilai" yang dipisahkan koma ini.
Secara default, set alat:
tunggu_waktu habis=10000
Variabel yang ditentukan pada baris perintah menggantikan default ini. Sebagai contoh,
menentukan "--set-vars wait_timeout=500" mengesampingkan nilai default 10000.
Alat ini mencetak peringatan dan melanjutkan jika variabel tidak dapat disetel.
--stopkontak
Surat pendek; jenis: string
File soket yang akan digunakan untuk koneksi.
--tabel
bentuk pendek: -t; jenis: hash
Hanya dapatkan indeks dari daftar tabel yang dipisahkan koma ini.
--tabel-regex
jenis: string
Hanya dapatkan indeks dari tabel yang namanya cocok dengan regex Perl ini.
--pengguna
bentuk pendek: -u; jenis: string
Pengguna untuk login jika bukan pengguna saat ini.
--Versi: kapan
Tampilkan versi dan keluar.
--[no]versi-periksa
default: ya
Periksa versi terbaru Percona Toolkit, MySQL, dan program lainnya.
Ini adalah fitur standar "periksa pembaruan secara otomatis", dengan dua tambahan
fitur. Pertama, alat ini memeriksa versi program lain di sistem lokal di
tambahan untuk versinya sendiri. Misalnya, ia memeriksa versi setiap server MySQL
itu terhubung ke, Perl, dan modul Perl DBD::mysql. Kedua, ia memeriksa dan memperingatkan
tentang versi dengan masalah yang diketahui. Misalnya, MySQL 5.5.25 memiliki bug kritis dan
dirilis ulang sebagai 5.5.25a.
Setiap pembaruan atau masalah yang diketahui dicetak ke STDOUT sebelum keluaran normal alat.
Fitur ini tidak boleh mengganggu pengoperasian normal alat.
Untuk informasi lebih lanjut, kunjungi .
DSN PILIHAN
Opsi DSN ini digunakan untuk membuat DSN. Setiap opsi diberikan seperti "opsi = nilai".
Opsi peka huruf besar/kecil, jadi P dan p bukan opsi yang sama. Tidak mungkin ada
spasi putih sebelum atau sesudah "=" dan jika nilainya mengandung spasi, itu harus dikutip.
Opsi DSN dipisahkan dengan koma. Lihat halaman manual percona-toolkit untuk detail lengkap.
· SEBUAH
dsn: rangkaian karakter; salinan: ya
Kumpulan karakter default.
· D
dsn: basis data; salinan: ya
Basis data untuk terhubung.
· F
dsn: mysql_read_default_file; salinan: ya
Hanya baca opsi default dari file yang diberikan
· H
dsn: tuan rumah; salinan: ya
Hubungkan ke tuan rumah.
· P
dsn: kata sandi; salinan: ya
Kata sandi untuk digunakan saat menghubungkan. Jika kata sandi mengandung koma, mereka harus diloloskan
dengan garis miring terbalik: "ujian\,ple"
· P
dsn: pelabuhan; salinan: ya
Nomor port yang digunakan untuk koneksi.
· S
dsn: mysql_socket; salinan: ya
File soket yang akan digunakan untuk koneksi.
· kamu
dsn: pengguna; salinan: ya
Pengguna untuk login jika bukan pengguna saat ini.
LINGKUNGAN
Variabel lingkungan "PTDEBUG" memungkinkan keluaran debugging verbose ke STDERR. Untuk mengaktifkan
debugging dan tangkap semua output ke file, jalankan alat seperti:
PTDEBUG=1 pt-index-penggunaan ... > FILE 2>&1
Hati-hati: keluaran debug sangat banyak dan dapat menghasilkan beberapa megabita keluaran.
SISTEM PERSYARATAN
Anda memerlukan Perl, DBI, DBD::mysql, dan beberapa paket inti yang harus diinstal di
versi Perl yang cukup baru.
Gunakan pt-index-usagep online menggunakan layanan onworks.net