我们可以使用 Show Indexes 语句获取表的索引信息。这个语句可以写成:
mysql> SHOW INDEXES FROM table_name;
在上面的语法中,我们可以看到,如果要获取一个表的索引,需要在FROM关键字后指定table_name。语句执行成功后,会返回当前数据库中某个表的索引信息。
如果我们想要获取不同数据库或您未连接的数据库中的表的索引信息,MySQL允许我们使用 Show Indexes 语句指定数据库名称。下面的语句更清楚地解释了它:
mysql> SHOW INDEXES FROM table_name IN database_name;
上面的语句也可以写成:
mysql> SHOW INDEXES FROM database_name.table_name;
注意:需要注意的是Index和Keys都是Indexes的同义词,IN是FROM关键字的同义词。因此,我们也可以使用这些同义词编写 Show Indexes 语句,如下所示:
mysql> SHOW INDEXES IN table_name FROM database_name;
或者,
mysql> SHOW KEYS FROM table_name IN database_name;
SHOW INDEX 查询返回以下字段/信息:
Table:它包含表的名称。
Non_unique:如果索引包含重复项,则返回 1。否则,它返回 0。
Key_name:它是索引的名称。如果表包含主键,则索引名称始终为 PRIMARY。
seq_in_index:索引中从1开始的列的序号。
Column_name:它包含列的名称。
Collation: 它提供有关列如何在索引中排序的信息。它包含的值A表示升序,D表示降序,Null表示未排序。
Cardinality: 它给出了索引表中唯一值的估计数量,其中基数越高表示 MySQL 使用索引的机会越大。
Sub_part:它是索引的前缀。如果表的所有列都被索引,则它具有 NULL 值。当列被部分索引时,它将返回索引字符数。
Packed: 它告诉密钥是如何打包的。否则,它返回 NULL。
NULL:如果该列没有 NULL 值则包含空白;否则,返回YES。
Index_type:它包含索引方法的名称,如 BTREE、HASH、RTREE、FULLTEXT 等。
Comment: 包含未在其列中描述的索引信息。例如,当索引被禁用时,它返回禁用。
Index_column:当您创建带有注释属性的索引时,它包含指定索引的注释。
Visible: 如果索引对查询优化器可见,则包含 YES,如果不可见,则包含 NO。
Expression: MySQL 8.0 支持影响表达式和column_name列的功能键部分。我们可以通过以下几点更清楚地理解它:
- 对于功能部件,表达式列代表关键部件的表达式,列名代表NULL。
- 对于非功能部分,表达式表示NULL,column_name 表示键部分索引的列。
MySQL 显示索引示例
在这里,我们将创建一个包含学生 ID、姓名、年龄、手机号码和电子邮件详细信息的表student_info。执行以下命令创建表:
CREATE TABLE `student_info` (
`studentid` int NOT NULL AUTO_INCREMENT,
`name` varchar(45) DEFAULT NULL,
`age` varchar(3) DEFAULT NULL,
`mobile` varchar(20) DEFAULT NULL,
`email` varchar(25) DEFAULT NULL,
PRIMARY KEY (`studentid`),
UNIQUE KEY `email_UNIQUE` (`email`)
)
接下来,我们通过以下命令在该表上创建索引:
mysql> CREATE INDEX mobile ON student_info (mobile) INVISIBLE;
mysql> CREATE INDEX name ON student_info (name) COMMENT 'Student Name';
现在,执行以下命令,从 student_info 表中返回所有索引信息:
mysql> SHOW INDEXES FROM student_info;
我们将得到以下输出:
过滤索引信息
我们可以使用where子句过滤索引信息。以下语句可用于过滤索引信息:
Mysql> SHOW INDEXES FROM table_name where condition;
例子
如果只想获取student_info 表的不可见索引,请执行以下命令:
mysql> SHOW INDEXES FROM student_info WHERE visible = 'NO';
它将给出以下输出: