The MySQL SHOW INDEX command

For a long time I couldn't remember how to show the indexes for a database table with MySQL, but I think it's finally sunk in. Just use the MySQL SHOW INDEX command, like this:

show index from node;

That example can be read as, "Show the indexes from the database table named node". It assumes that you have already selected a database table, so really, a full sequence of commands to show a MySQL database table index looks like this:

# log into your mysql database
$ mysql -u root -p

# once in mysql, select your database
mysql> use drupal;
Database changed

# now show the index on the node table in the drupal database
mysql> show index from node;

Or, if you prefer, you don't have to switch to your database, you can include the name of the database in your show index query, like this:

show indexes from node from drupal;

Syntax variations

As you may have noticed from that last example, you don't have to type show index; either of the following three commands will give you the same results:

show index from node;
show indexes from node;
show keys from node;

I actually prefer the second version (show indexes) because it's easier to read, and closely corresponds to how I'd like to say this as a human being: "Show the indexes from (the database table named) node".

Output from MySQL SHOW INDEX

Of course the output from the MySQL show index command will vary depending on the indexes that have been created on your table, but here's what it looks like when I run it on my Drupal term_data table on my test server:

+-----------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table     | Non_unique | Key_name      | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| term_data |          0 | PRIMARY       |            1 | tid         | A         |        3224 |     NULL | NULL   |      | BTREE      |         | 
| term_data |          1 | taxonomy_tree |            1 | vid         | A         |           2 |     NULL | NULL   |      | BTREE      |         | 
| term_data |          1 | taxonomy_tree |            2 | weight      | A         |           2 |     NULL | NULL   |      | BTREE      |         | 
| term_data |          1 | taxonomy_tree |            3 | name        | A         |        3224 |     NULL | NULL   |      | BTREE      |         | 
| term_data |          1 | vid_name      |            1 | vid         | A         |           2 |     NULL | NULL   |      | BTREE      |         | 
| term_data |          1 | vid_name      |            2 | name        | A         |        3224 |     NULL | NULL   |      | BTREE      |         | 
+-----------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
6 rows in set (0.00 sec)

The key_name column shows the names of the indexes on the table, so in this case, my term_data table has the following indexes:

  • PRIMARY
  • taxonomy_tree
  • vid_name

As its name implies, the PRIMARY key is the key on the primary field of the table. The Seq_in_index column tells you the sequence of each field in the index, so the taxonomy_tree index is a compound index, with the following three fields in the key:

  • vid
  • weight
  • name

Another way to see MySQL indexes

You can confirm this with another MySQL SHOW command, a command which also lets you see the indexes on a MySQL database table. This time we use the show create table syntax, which looks like this when run on the term_data table:

show create table term_data;

Here's the output from that command:

term_data | CREATE TABLE `term_data` (
  `tid` int(10) unsigned NOT NULL auto_increment,
  `vid` int(10) unsigned NOT NULL default '0',
  `name` varchar(255) NOT NULL default '',
  `description` longtext,
  `weight` tinyint(4) NOT NULL default '0',
  PRIMARY KEY  (`tid`),
  KEY `taxonomy_tree` (`vid`,`weight`,`name`),
  KEY `vid_name` (`vid`,`name`)
) ENGINE=MyISAM AUTO_INCREMENT=3228 DEFAULT CHARSET=utf8 

As you can see from this line of that output:

KEY `taxonomy_tree` (`vid`,`weight`,`name`),

the taxonomy_tree index has the three fields in the sequence shown earlier.

Help remembering these commands

If (like me) you have trouble remembering these MySQL SHOW commands, it may be easier to just remember this MySQL help command:

help show;

In MySQL 5.x, this help command shows the following output, including the two commands I've covered in this article:

mysql> help show;
Name: 'SHOW'
Description:
SHOW has many forms that provide information about databases, tables,
columns, or status information about the server. This section describes
those following:

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']
SHOW CREATE DATABASE db_name
SHOW CREATE FUNCTION funcname
SHOW CREATE PROCEDURE procname
SHOW CREATE TABLE tbl_name
SHOW DATABASES [LIKE 'pattern']
SHOW ENGINE engine_name {LOGS | STATUS }
SHOW [STORAGE] ENGINES
SHOW ERRORS [LIMIT [offset,] row_count]
SHOW FUNCTION CODE sp_name
SHOW FUNCTION STATUS [LIKE 'pattern']
SHOW GRANTS FOR user
SHOW INDEX FROM tbl_name [FROM db_name]
SHOW INNODB STATUS
SHOW PROCEDURE CODE sp_name
SHOW PROCEDURE STATUS [LIKE 'pattern']
SHOW [BDB] LOGS
SHOW MUTEX STATUS
SHOW PRIVILEGES
SHOW [FULL] PROCESSLIST
SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n]
SHOW PROFILES
SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern']
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
SHOW [OPEN] TABLES [FROM db_name] [LIKE 'pattern']
SHOW TRIGGERS
SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern']
SHOW WARNINGS [LIMIT [offset,] row_count]

The SHOW statement also has forms that provide information about
replication master and slave servers and are described in [HELP PURGE
MASTER LOGS]:

SHOW BINARY LOGS
SHOW BINLOG EVENTS
SHOW MASTER STATUS
SHOW SLAVE HOSTS
SHOW SLAVE STATUS

If the syntax for a given SHOW statement includes a LIKE 'pattern'
part, 'pattern' is a string that can contain the SQL `%' and `_'
wildcard characters. The pattern is useful for restricting statement
output to matching values.

Several SHOW statements also accept a WHERE clause that provides more
flexibility in specifying which rows to display. See
http://dev.mysql.com/doc/refman/5.0/en/extended-show.html.

URL: http://dev.mysql.com/doc/refman/5.0/en/show.html

As a final point of reference, here's a link to the MySQL SHOW INDEX documentation.