¿Cómo ver los índices de una base de datos o tabla en MySQL?

486

¿Cómo veo si mi base de datos tiene algún índice?

¿Qué tal para una mesa específica?

Blankman
fuente
solo use: sp_helpindex 'nombre de tabla'
usuario3772443
"solo use: 'nombre de tabla' sp_helpindex" que parece ser SQL Server (MSSQL) @ user3772443 no MySQL
Raymond Nijland

Respuestas:

794

Para ver el índice de una tabla específica, use SHOW INDEX:

SHOW INDEX FROM yourtable;

Para ver los índices de todas las tablas dentro de un esquema específico, puede usar la tabla STATISTICS de INFORMATION_SCHEMA:

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

Al eliminar la cláusula where, se mostrarán todos los índices en todos los esquemas.

Mark Byers
fuente
10
Tenga en cuenta que la DISTINCTpalabra clave enmascarará algunos índices: tengo una tabla donde un índice tiene el mismo nombre pero se usa en dos columnas diferentes, por lo que el ejemplo de esquema de información aquí solo mostrará un índice.
Ben
Tuve que agregar from mydbcomo se muestra en la respuesta de LiorK.
Nate
@ Mark Byers ¿Hay alguna forma de ver la tabla de índice en sí? ¿Cómo genera SQL el archivo de índice internamente? ¿Cómo almacena un puntero de un registro de la tabla de índice a la tabla principal?
yajant b
Entonces mi tabla aparece en INFORMATION_SCHEMA.STATISTICS pero solo tiene una entrada, index_name. No hay entrada adicional para indicar el nombre de la columna. Todas las otras tablas tienen múltiples entradas que muestran algo como esto: PRIMARY c1, c2 donde c1, c2 constituyen la clave primaria compuesta. ¿Alguna idea de por qué?
Stevers
56

Si desea ver todos los índices en todas las bases de datos a la vez:

use information_schema;
SELECT * FROM statistics;
RolandoMySQLDBA
fuente
44
Como una frase:SELECT * FROM information_schema.statistics;
enarmónica
44
SHOW INDEX FROM mytable FROM mydb;

SHOW INDEX FROM mydb.mytable;

Ver documentación .

LiorK
fuente
7

Puede usar esta consulta para obtener el no de índices, así como los nombres de índice de cada tabla en la base de datos especificada.

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

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

Encontraste todo el índice solo índice.

Considerar.

usuario2065095
fuente
3

Para obtener todas las columnas indexadas por índice en una columna en el orden de secuencia.

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

Para verificar todos los índices deshabilitados en db

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

Puede verificar sus índices en MySQL workbench. Debajo de las pestañas de informes de rendimiento, puede ver todos los índices usados ​​e índices no usados ​​en el sistema. o puedes disparar la consulta.

select * from sys.schema_index_statistics;
Ganesh Giri
fuente
Paul, ¿qué herramienta estás usando? Este código funciona en mysql workbeanch.
Ganesh Giri
Lo usé en el shell de MySQL
Paul Basenko
¿Puedes probar este usando Mysql Workbench? seleccione * de sys.schema_index_statistics;
Ganesh Giri
2

Esto funciona en mi caso para obtener el nombre de la tabla y el nombre de la columna en la tabla correspondiente para los campos indexados.

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