Bagaimana cara melihat indeks untuk database atau tabel di MySQL?


486

Bagaimana saya melihat apakah database saya memiliki indeks?

Bagaimana dengan tabel tertentu?


cukup gunakan: sp_helpindex 'nama tabel'
user3772443

"cukup gunakan: sp_helpindex 'nama tabel'" yang tampaknya SQL Server (MSSQL) @ user3772443 bukan MySQL
Raymond Nijland

Jawaban:


794

Untuk melihat indeks untuk tabel tertentu, gunakan SHOW INDEX:

SHOW INDEX FROM yourtable;

Untuk melihat indeks untuk semua tabel dalam skema tertentu, Anda dapat menggunakan tabel STATISTICS dari INFORMATION_SCHEMA:

SELECT DISTINCT
    TABLE_NAME,
    INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_schema';

Menghapus klausa di mana akan menampilkan semua indeks di semua skema.


10
Perhatikan bahwa DISTINCTkata kunci akan menutupi beberapa indeks - Saya memiliki tabel di mana indeks memiliki nama yang sama tetapi digunakan pada dua kolom yang berbeda, jadi contoh skema informasi di sini hanya akan menampilkan satu indeks.
Ben

Saya harus menambahkan from mydbseperti yang ditunjukkan dalam jawaban LiorK.
Nate

@Ark Byers Apakah ada cara untuk melihat tabel indeks itu sendiri? Bagaimana SQL menghasilkan file indeks secara internal? Bagaimana cara menyimpan pointer catatan dari tabel indeks ke Tabel Utama?
yajant b

Jadi tabel saya muncul di INFORMATION_SCHEMA.STATISTICS tetapi hanya memiliki satu entri, nama_indeks. Tidak ada entri tambahan untuk menunjukkan nama kolom. Semua tabel lainnya memiliki beberapa entri yang menunjukkan sesuatu seperti ini: PRIMARY c1, c2 di mana c1, c2 membuat kunci primer komposit. Ada yang tahu kenapa?
Stevers

56

Jika Anda ingin melihat semua indeks di semua database sekaligus:

use information_schema;
SELECT * FROM statistics;

4
Sebagai one-liner:SELECT * FROM information_schema.statistics;
enharmonic


7

Anda bisa menggunakan kueri ini untuk mendapatkan no of indexes serta nama-nama indeks dari setiap tabel dalam database yang ditentukan.

SELECT TABLE_NAME,
       COUNT(1) index_count,
       GROUP_CONCAT(DISTINCT(index_name) SEPARATOR ',\n ') indexes
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'mydb'
      AND INDEX_NAME != 'primary'
GROUP BY TABLE_NAME
ORDER BY COUNT(1) DESC;

5

Saya mengusulkan pertanyaan ini:

SELECT DISTINCT s.*
FROM INFORMATION_SCHEMA.STATISTICS s
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS t 
    ON t.TABLE_SCHEMA = s.TABLE_SCHEMA 
       AND t.TABLE_NAME = s.TABLE_NAME
       AND s.INDEX_NAME = t.CONSTRAINT_NAME 
WHERE 0 = 0
      AND t.CONSTRAINT_NAME IS NULL
      AND s.TABLE_SCHEMA = 'YOUR_SCHEMA_SAMPLE';

Anda menemukan semua Indeks hanya indeks.

Menganggap.



2

Untuk memeriksa semua indeks yang dinonaktifkan pada db

SELECT INDEX_SCHEMA, COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'mydb'
AND COMMENT = 'disabled'

2

Anda dapat memeriksa indeks di MySQL workbench. Di bawah tab laporan kinerja, Anda dapat melihat semua indeks yang digunakan dan indeks yang tidak digunakan pada sistem. atau Anda dapat memecat kueri.

select * from sys.schema_index_statistics;

Paul alat apa yang Anda gunakan? Kode ini berfungsi untuk di mysql workbeanch.
Ganesh Giri

Saya menggunakannya di shell MySQL
Paul Basenko

Bisakah Anda mencoba yang ini menggunakan Mysql Workbench. pilih * dari sys.schema_index_statistics;
Ganesh Giri

2

Ini berfungsi dalam kasus saya untuk mendapatkan nama tabel dan nama kolom di tabel terkait untuk bidang yang diindeks.

SELECT TABLE_NAME , COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'database_name';
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.