Como ver índices para um banco de dados ou tabela no MySQL?

486

Como ver se meu banco de dados possui algum índice?

Que tal para uma tabela específica?

Blankman
fonte
basta usar: sp_helpindex 'nome da tabela'
user3772443 14/01
"apenas use: sp_helpindex 'nome da tabela'" que parece ser o SQL Server (MSSQL) @ user3772443 e não o MySQL
Raymond Nijland

Respostas:

794

Para ver o índice de uma tabela específica, use SHOW INDEX:

SHOW INDEX FROM yourtable;

Para ver índices para todas as tabelas em um esquema específico, você pode usar a tabela STATISTICS em INFORMATION_SCHEMA:

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

A remoção da cláusula where mostra todos os índices em todos os esquemas.

Mark Byers
fonte
10
Observe que a DISTINCTpalavra - chave mascarará alguns índices - eu tenho uma tabela em que um índice tem o mesmo nome, mas é usado em duas colunas diferentes; portanto, o exemplo do esquema de informações aqui mostrará apenas um índice.
Ben
Eu tive que adicionar from mydbcomo mostrado na resposta do LiorK.
Nate
@ Mark Byers Existe uma maneira de ver a própria tabela de índices? Como o SQL gera o arquivo de índice internamente? Como ele armazena um ponteiro de um registro da tabela de índice na tabela principal?
yajant b
Portanto, minha tabela aparece em INFORMATION_SCHEMA.STATISTICS, mas ela possui apenas uma entrada, o index_name. Não há entrada adicional para indicar o nome da coluna. Todas as outras tabelas têm várias entradas que mostram algo parecido com isto: PRIMARY c1, c2 onde c1, c2 compõem a chave primária composta. Alguma idéia do porquê?
Stevers 24/03
56

Se você deseja ver todos os índices em todos os bancos de dados de uma só vez:

use information_schema;
SELECT * FROM statistics;
RolandoMySQLDBA
fonte
4
Como one-liner:SELECT * FROM information_schema.statistics;
enharmonic
44
SHOW INDEX FROM mytable FROM mydb;

SHOW INDEX FROM mydb.mytable;

Veja a documentação .

LiorK
fonte
7

Você pode usar esta consulta para obter o número de índices e os nomes de cada tabela no banco de dados especificado.

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

Eu proponho esta consulta:

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

Você encontrou todo o índice apenas do índice.

Que diz respeito.

user2065095
fonte
3

Para obter todas as colunas indexadas por índice em uma coluna na ordem de sequência.

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

Para verificar todos os índices desabilitados no db

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

Você pode verificar seus índices no ambiente de trabalho MySQL. Nas guias de relatórios de desempenho, você pode ver todos os índices usados ​​e não utilizados no sistema. ou você pode disparar a consulta.

select * from sys.schema_index_statistics;
Ganesh Giri
fonte
Paul qual ferramenta você está usando? Este código funciona no mysql workbeanch.
Ganesh Giri
Eu usei-o no shell do MySQL
Paul Basenko 13/17
Você pode tentar este usando o Mysql Workbench. selecione * em sys.schema_index_statistics;
Ganesh Giri
2

Isso funciona no meu caso para obter o nome da tabela e o nome da coluna na tabela correspondente para campos indexados.

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