628

How do I see if my database has any indexes on it?

How about for a specific table?

2
  • just use : sp_helpindex 'table name' Commented Jan 14, 2019 at 23:15
  • 3
    "just use : sp_helpindex 'table name' " that seams to be SQL Server (MSSQL) @user3772443 not MySQL Commented Oct 21, 2019 at 11:16

14 Answers 14

989

To see the index for a specific table use SHOW INDEX:

SHOW INDEX FROM yourtable; 

To see indexes for all tables within a specific schema you can use the STATISTICS table from INFORMATION_SCHEMA:

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

Removing the where clause will show you all indexes in all schemas.

Sign up to request clarification or add additional context in comments.

3 Comments

Note that the DISTINCT keyword will mask some indexes - I have a table where an index has the same name but is used on two different columns, so the information schema example here will only show one index.
@Mark Byers Is there a way to see the index table itself? How does SQL generate the index file internally? How does it stores a pointer of a record from index table to Main Table ?
So my table shows up in INFORMATION_SCHEMA.STATISTICS but it only has one entry, the index_name. There's no additional entry to indicate the column name. All other tables have multiple entries that show something like this: PRIMARY c1, c2 where c1, c2 make up the composite primary key. Any idea why?
75

If you want to see all indexes across all databases all at once:

use information_schema; SELECT * FROM statistics; 

1 Comment

As a one-liner: SELECT * FROM information_schema.statistics;
59
SHOW INDEX FROM mytable FROM mydb; SHOW INDEX FROM mydb.mytable; 

See documentation.

Comments

15

to see indexes you have created use

SHOW INDEX from your_table_name; 

to see all indexes on a table ( created by DB and you)

SHOW EXTENDED INDEX from your_table_name; 

Comments

12

You could use this query to get the no of indexes as well as the index names of each table in specified database.

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; 

Comments

8

To get all indexed columns per index in one column in the sequence order.

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/

Comments

8

Why not show create table myTable ?

Someone told me this but I didn't see anyone mention here, anything bad?

It's neat if you just want to take a glance at the indexes along with column infomations.

1 Comment

I was confused looking at the output of SHOW INDEX until I did show create table. I found this answer useful in tandem with other answers.
6

This works in my case for getting table name and column name in the corresponding table for indexed fields.

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

Comments

5

I propose this query:

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

You found all Index only index.

Regard.

Comments

3

To check all disabled indexes on db

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

Comments

2

You can check your indexes in MySQL workbench.under the performance reports tabs you can see all used indexes and unused indexes on the system. or you can fire the query.

select * from sys.schema_index_statistics; 

3 Comments

Paul which tool you are using?This code work for in mysql workbeanch.
I used it in MySQL shell
Can you try this one using Mysql Workbench. select * from sys.schema_index_statistics;
1

To query the index information of a table, you use the SHOW INDEXES statement as follows:

 SHOW INDEXES FROM table_name; 

You can specify the database name if you are not connected to any database or you want to get the index information of a table in a different database:

SHOW INDEXES FROM table_name IN database_name; 

The following query is similar to the one above:

SHOW INDEXES FROM database_name.table_name; 

Note that INDEX and KEYS are the synonyms of the INDEXES, IN is the synonym of the FROM, therefore, you can use these synonyms in the SHOW INDEXES column instead. For example:

SHOW INDEX IN table_name FROM database_name; 

Or

 SHOW KEYS FROM tablename IN databasename; 

Comments

1
select table_name, index_name, seq_in_index, column_name, non_unique, index_type, comment from information_schema.statistics where 1=1 and table_schema = 'my_schema' and table_name = 'my_table' order by 1,2,3,4,5,6 

Comments

-2

we can directly see the indexes on to the table if we know the index name with below :

select * from all_indexes where index_name= 'your index'

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.