Jak wyświetlić indeksy bazy danych lub tabeli w MySQL?


Odpowiedzi:


793

Aby zobaczyć indeks dla konkretnej tabeli użyj SHOW INDEX:

SHOW INDEX FROM yourtable;

Aby zobaczyć indeksy dla wszystkich tabel w ramach określonego schematu, możesz użyć tabeli STATISTICS z INFORMACJE_SCHEMA:

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

Usunięcie klauzuli where spowoduje wyświetlenie wszystkich indeksów we wszystkich schematach.


10
Zauważ, że DISTINCTsłowo kluczowe zamaskuje niektóre indeksy - Mam tabelę, w której indeks ma tę samą nazwę, ale jest używany w dwóch różnych kolumnach, więc przykładowy schemat informacyjny pokaże tylko jeden indeks.
Ben

Musiałem dodać, from mydbjak pokazano w odpowiedzi LiorK.
Nate,

@Mark Byers Czy istnieje sposób, aby zobaczyć samą tabelę indeksu? W jaki sposób SQL wewnętrznie generuje plik indeksu? Jak przechowuje wskaźnik rekordu z tabeli indeksu do tabeli głównej?
yajant b

Więc moja tabela pojawia się w INFORMACJE_SCHEMA.STATYSTYKA, ale ma tylko jeden wpis, nazwa_indeksu. Nie ma dodatkowego wpisu wskazującego nazwę kolumny. Wszystkie pozostałe tabele zawierają wiele wpisów, które pokazują coś takiego: PODSTAWOWE c1, c2 gdzie c1, c2 tworzą złożony klucz podstawowy. Masz pomysł, dlaczego?
Stevers

56

Jeśli chcesz zobaczyć wszystkie indeksy we wszystkich bazach danych jednocześnie:

use information_schema;
SELECT * FROM statistics;

4
Jako jeden liniowiec:SELECT * FROM information_schema.statistics;
enharmonic


7

Można użyć tego zapytania, aby uzyskać liczbę indeksów, a także nazwy indeksów każdej tabeli w określonej bazie danych.

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

Proponuję to zapytanie:

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';

Znalazłeś wszystkie indeksy tylko indeksowe.

Uważać.



2

Aby sprawdzić wszystkie wyłączone indeksy na db

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

2

Możesz sprawdzić swoje indeksy w MySQL workbench. Na kartach raportów wydajności możesz zobaczyć wszystkie używane i nieużywane indeksy w systemie. lub możesz uruchomić zapytanie.

select * from sys.schema_index_statistics;

Paul, którego narzędzia używasz? Ten kod działa w mysql workbeanch.
Ganesh Giri

Użyłem go w powłoce MySQL
Paul Basenko

Czy możesz wypróbować ten przy użyciu Mysql Workbench. wybierz * z sys.schema_index_statistics;
Ganesh Giri

2

Działa to w moim przypadku w celu uzyskania nazwy tabeli i nazwy kolumny w odpowiedniej tabeli dla pól indeksowanych.

SELECT TABLE_NAME , COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'database_name';
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.