Comment voir les index d'une base de données ou d'une table dans MySQL?

486

Comment puis-je voir si ma base de données contient des index?

Et pour une table spécifique?

Blankman
la source
il suffit d'utiliser: sp_helpindex 'nom de table'
user3772443
"utilisez simplement: sp_helpindex 'nom de table'" qui semble être SQL Server (MSSQL) @ user3772443 et non MySQL
Raymond Nijland

Réponses:

794

Pour voir l'index d'une table spécifique, utilisez SHOW INDEX:

SHOW INDEX FROM yourtable;

Pour voir les index de toutes les tables d'un schéma spécifique, vous pouvez utiliser la table STATISTICS de INFORMATION_SCHEMA:

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

La suppression de la clause where affichera tous les index de tous les schémas.

Mark Byers
la source
10
Notez que le DISTINCTmot - clé masquera certains index - J'ai une table où un index porte le même nom mais est utilisé sur deux colonnes différentes, donc l'exemple de schéma d'information ici ne montrera qu'un seul index.
Ben
J'ai dû ajouter from mydbcomme indiqué dans la réponse de LiorK.
Nate
@Mark Byers Existe-t-il un moyen de voir la table d'index elle-même? Comment SQL génère-t-il le fichier d'index en interne? Comment stocke-t-il le pointeur d'un enregistrement de la table d'index vers la table principale?
yajant b
Donc, ma table apparaît dans INFORMATION_SCHEMA.STATISTICS mais elle n'a qu'une seule entrée, l'index_name. Il n'y a aucune entrée supplémentaire pour indiquer le nom de la colonne. Toutes les autres tables ont plusieurs entrées qui montrent quelque chose comme ceci: PRIMARY c1, c2 où c1, c2 constituent la clé primaire composite. Une idée pourquoi?
Stevers
56

Si vous souhaitez voir tous les index de toutes les bases de données en une seule fois:

use information_schema;
SELECT * FROM statistics;
RolandoMySQLDBA
la source
4
En one-liner:SELECT * FROM information_schema.statistics;
enharmonic
7

Vous pouvez utiliser cette requête pour obtenir le nombre d'index ainsi que les noms d'index de chaque table dans la base de données spécifiée.

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
la source
5

Je propose cette requête:

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

Vous avez trouvé tous les index uniquement index.

Qui concerne.

user2065095
la source
3

Pour obtenir toutes les colonnes indexées par index dans une colonne dans l'ordre des séquences.

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;

Réf: http://blog.9minutesnooze.com/mysql-information-schema-indexes/

Janak
la source
2

Pour vérifier tous les index désactivés sur db

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

Vous pouvez vérifier vos index dans MySQL workbench. Sous les onglets des rapports de performances, vous pouvez voir tous les index utilisés et les index inutilisés sur le système. ou vous pouvez lancer la requête.

select * from sys.schema_index_statistics;
Ganesh Giri
la source
Paul pour quel outil vous utilisez? Ce code fonctionne dans mysql workbeanch.
Ganesh Giri,
Je l'ai utilisé dans le shell MySQL
Paul Basenko
Pouvez-vous essayer celui-ci en utilisant Mysql Workbench. sélectionnez * dans sys.schema_index_statistics;
Ganesh Giri
2

Cela fonctionne dans mon cas pour obtenir le nom de la table et le nom de la colonne dans la table correspondante pour les champs indexés.

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