Come visualizzare gli indici per un database o una tabella in MySQL?


486

Come posso vedere se il mio database ha degli indici?

Che ne dici di una tabella specifica?


basta usare: sp_helpindex 'nome tabella'
user3772443

"basta usare: sp_helpindex 'nome tabella'" che sembra essere SQL Server (MSSQL) @ user3772443 non MySQL
Raymond Nijland

Risposte:


794

Per vedere l'indice per una tabella specifica utilizzare SHOW INDEX:

SHOW INDEX FROM yourtable;

Per visualizzare gli indici per tutte le tabelle all'interno di uno schema specifico, è possibile utilizzare la tabella STATISTICA da INFORMATION_SCHEMA:

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

La rimozione della clausola where ti mostrerà tutti gli indici in tutti gli schemi.


10
Nota che la DISTINCTparola chiave maschererà alcuni indici: ho una tabella in cui un indice ha lo stesso nome ma viene utilizzato su due colonne diverse, quindi l'esempio di schema informativo qui mostrerà solo un indice.
Ben

Ho dovuto aggiungere from mydbcome mostrato nella risposta di LiorK.
Nate,

@Mark Byers C'è un modo per vedere la stessa tabella degli indici? In che modo SQL genera il file indice internamente? Come memorizza un puntatore di un record dalla tabella dell'indice alla tabella principale?
yajant b

Quindi la mia tabella appare in INFORMATION_SCHEMA.STATISTICS ma ha solo una voce, index_name. Non ci sono voci aggiuntive per indicare il nome della colonna. Tutte le altre tabelle hanno più voci che mostrano qualcosa del genere: PRIMARY c1, c2 dove c1, c2 compongono la chiave primaria composita. Qualche idea sul perché?
Stevers,

56

Se si desidera visualizzare contemporaneamente tutti gli indici in tutti i database:

use information_schema;
SELECT * FROM statistics;

4
Come one-liner:SELECT * FROM information_schema.statistics;
enarmonico


7

È possibile utilizzare questa query per ottenere il numero di indici e i nomi degli indici di ciascuna tabella nel database specificato.

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

Propongo questa domanda:

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

Hai trovato tutti gli indici solo indice.

Considerare.



2

Per controllare tutti gli indici disabilitati su db

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

2

Puoi controllare i tuoi indici in MySQL workbench. Sotto le schede dei rapporti sulle prestazioni puoi vedere tutti gli indici usati e gli indici inutilizzati sul sistema. oppure puoi attivare la query.

select * from sys.schema_index_statistics;

Paul per quale strumento stai usando? Questo codice funziona con mysql workbeanch.
Ganesh Giri,

L'ho usato nella shell MySQL
Paul Basenko il

Puoi provare questo usando Mysql Workbench. seleziona * da sys.schema_index_statistics;
Ganesh Giri,

2

Questo funziona nel mio caso per ottenere il nome della tabella e il nome della colonna nella tabella corrispondente per i campi indicizzati.

SELECT TABLE_NAME , COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'database_name';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.