Bagaimana cara melihat indeks untuk database atau tabel di MySQL?

486

Bagaimana saya melihat apakah database saya memiliki indeks?

Bagaimana dengan tabel tertentu?

Blankman
sumber
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.

Mark Byers
sumber
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;
RolandoMySQLDBA
sumber
4
Sebagai one-liner:SELECT * FROM information_schema.statistics;
enharmonic
44
SHOW INDEX FROM mytable FROM mydb;

SHOW INDEX FROM mydb.mytable;

Lihat dokumentasi .

LiorK
sumber
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;
adeviloper
sumber
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.

pengguna2065095
sumber
3

Untuk mendapatkan semua kolom yang diindeks per indeks dalam satu kolom dalam urutan urutan.

SELECT table_name AS `Table`,
       index_name AS `Index`,
       GROUP_CONCAT(column_name ORDER BY seq_in_index) AS `Columns`
FROM information_schema.statistics
WHERE table_schema = 'sakila'
GROUP BY 1,2;

Ref: http://blog.9minutesnooze.com/mysql-information-schema-indexes/

Janak
sumber
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'
Digital87
sumber
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;
Ganesh Giri
sumber
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';
asim
sumber