Wie werden Indizes für eine Datenbank oder Tabelle in MySQL angezeigt?

486

Wie sehe ich, ob meine Datenbank Indizes enthält?

Wie wäre es mit einem bestimmten Tisch?

Blankman
quelle
Verwenden Sie einfach: sp_helpindex 'Tabellenname'
user3772443
"Verwenden Sie einfach: sp_helpindex 'Tabellenname'" , der SQL Server (MSSQL) @ user3772443 und nicht MySQL sein soll
Raymond Nijland

Antworten:

794

Verwenden Sie SHOW INDEX, um den Index für eine bestimmte Tabelle anzuzeigen:

SHOW INDEX FROM yourtable;

Um Indizes für alle Tabellen innerhalb eines bestimmten Schemas anzuzeigen, können Sie die STATISTICS-Tabelle von INFORMATION_SCHEMA verwenden:

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

Wenn Sie die where-Klausel entfernen, werden alle Indizes in allen Schemas angezeigt.

Mark Byers
quelle
10
Beachten Sie, dass das DISTINCTSchlüsselwort einige Indizes maskiert. Ich habe eine Tabelle, in der ein Index denselben Namen hat, aber für zwei verschiedene Spalten verwendet wird. Daher zeigt das Beispiel für das Informationsschema hier nur einen Index.
Ben
Ich musste hinzufügen, from mydbwie in LiorKs Antwort gezeigt.
Nate
@Mark Byers Gibt es eine Möglichkeit, die Indextabelle selbst anzuzeigen? Wie generiert SQL die Indexdatei intern? Wie speichert es einen Zeiger eines Datensatzes von der Indextabelle zur Haupttabelle?
Yajant b
Meine Tabelle wird also in INFORMATION_SCHEMA.STATISTICS angezeigt, hat aber nur einen Eintrag, den Indexnamen. Es gibt keinen zusätzlichen Eintrag, der den Spaltennamen angibt. Alle anderen Tabellen haben mehrere Einträge, die ungefähr Folgendes anzeigen: PRIMARY c1, c2 wobei c1, c2 den zusammengesetzten Primärschlüssel bilden. Irgendeine Idee warum?
Stevers
56

Wenn Sie alle Indizes in allen Datenbanken gleichzeitig anzeigen möchten:

use information_schema;
SELECT * FROM statistics;
RolandoMySQLDBA
quelle
4
Als Einzeiler:SELECT * FROM information_schema.statistics;
Enharmonic
44
SHOW INDEX FROM mytable FROM mydb;

SHOW INDEX FROM mydb.mytable;

Siehe Dokumentation .

LiorK
quelle
7

Mit dieser Abfrage können Sie die Anzahl der Indizes sowie die Indexnamen jeder Tabelle in der angegebenen Datenbank abrufen.

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
quelle
5

Ich schlage diese Abfrage vor:

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

Sie haben alle Index nur Index gefunden.

Betrachten.

user2065095
quelle
3

Um alle indizierten Spalten pro Index in einer Spalte in der Reihenfolge der Reihenfolge abzurufen.

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
quelle
2

So überprüfen Sie alle deaktivierten Indizes für db

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

Sie können Ihre Indizes in MySQL Workbench überprüfen. Auf den Registerkarten für Leistungsberichte können Sie alle verwendeten und nicht verwendeten Indizes auf dem System anzeigen. oder Sie können die Abfrage auslösen.

select * from sys.schema_index_statistics;
Ganesh Giri
quelle
Paul, welches Tool verwenden Sie? Dieser Code funktioniert in MySQL Workbeanch.
Ganesh Giri
Ich habe es in der MySQL-Shell verwendet
Paul Basenko
Können Sie dies mit MySQL Workbench versuchen. Wählen Sie * aus sys.schema_index_statistics;
Ganesh Giri
2

Dies funktioniert in meinem Fall, um den Tabellennamen und den Spaltennamen in der entsprechenden Tabelle für indizierte Felder abzurufen.

SELECT TABLE_NAME , COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'database_name';
asim
quelle