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


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.


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;

4
Como one-liner:SELECT * FROM information_schema.statistics;
enharmonic


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;

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.



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'

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;

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';
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.