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

485

Jak mogę sprawdzić, czy moja baza danych zawiera jakieś indeksy?

Co powiesz na konkretny stół?

Blankman
źródło
wystarczy użyć: sp_helpindex 'nazwa tabeli'
użytkownik3772443
„wystarczy użyć: nazwa tabeli sp_helpindex”, która wygląda na SQL Server (MSSQL) @ użytkownik3772443 nie MySQL
Raymond Nijland

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.

Mark Byers
źródło
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;
RolandoMySQLDBA
źródło
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;
adeviloper
źródło
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ć.

user2065095
źródło
3

Aby uzyskać wszystkie indeksowane kolumny na indeks w jednej kolumnie w kolejności sekwencji.

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
źródło
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'
Digital87
źródło
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;
Ganesh Giri
źródło
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';
asim
źródło