概述:

SHOW INDEX语句是MySQL中用于查看表索引信息的语句。它提供了有关表中索引的详细信息,包括索引名称、索引类型、关联的列等。以下是SHOW INDEX的详细说明:

语法:

SHOW INDEX FROM table_name [FROM db_name] [WHERE condition];

参数说明:

  • table_name:
    • 需要查询索引的表名。
  • db_name:
    • (可选)数据库名。如果你已经在某个数据库上下文中,可以省略此参数。
  • condition:
    • (可选)可以添加WHERE子句来筛选索引信息,比如根据索引名称、索引类型等进行筛选。

SHOW INDEX语句返回以下信息:

  • table:
    • 表名。
  • non_unique:
    • 是否允许重复值。如果值为1,表示允许重复值;如果值为0,表示不允许重复值(唯一索引)。
  • key_name:
    • 索引名称。主键索引名通常为PRIMARY。
  • seq_in_index:
    • 索引中的列的序号。对于组合索引,这表示列在索引中的位置。
  • column_name:
    • 列名,索引涉及的列。
  • collation:
    • 排序规则。A表示升序,NULL表示不可排序。
  • cardinality:
    • 索引的基数。这是一个估算值,表示索引中唯一值的数量。这个值对于查询优化器选择索引非常重要。
  • sub_part:
    • 索引的前缀长度。对于部分索引,这表示索引的前缀长度。
  • packed:
    • 索引是否被压缩。如果索引未被压缩,该列的值为NULL。
  • null:
    • 列是否允许包含NULL值。
  • index_type:
    • 索引类型。常见的类型有BTREE、HASH、FULLTEXT等。
  • comment:
    • 索引的备注。

示例:

下面是一个名为examples的表,其中包含各种类型的索引:主键索引、唯一索引、普通索引、前缀索引和联合索引。

CREATE TABLE examples ( id INT AUTO_INCREMENT, name VARCHAR(255), description TEXT, category VARCHAR(255), price DECIMAL(10, 2), PRIMARY KEY (id), UNIQUE KEY idx_name (name), KEY idx_category (category), KEY idx_category_price (category, price), KEY idx_name_prefix (name(10))) ENGINE=InnoDB;

在这个示例中,我们创建了一个名为examples的表,包含以下类型的索引:

  • 主键索引(PRIMARY KEY):
    • id列是主键索引。主键索引要求唯一且不允许NULL值。
  • 唯一索引(UNIQUE KEY):
    • name列是唯一索引。唯一索引要求唯一,但允许NULL值。
  • 普通索引(KEY):
    • category列是普通索引。普通索引允许重复值和NULL值。
  • 联合索引(KEY):
    • category和price列组成了一个联合索引。这允许根据这两个列的组合进行更快的查询。
  • 前缀索引(KEY):
    • name列的前10个字符被用作前缀索引。前缀索引允许在索引较长的字符串列时节省存储空间和提高查询速度,但可能会影响查询准确性。

现在,使用SHOW INDEX语句查询examples表的索引信息:

SHOW INDEX FROM examples;

输出结果(以表格形式表示):

在SHOW INDEX的输出中,你可以看到examples表的各种类型索引:

  • 主键索引(PRIMARY KEY):
    • 在key_name列中,PRIMARY关键字表示该行对应的是主键索引。non_unique列的值为0,说明主键索引的值必须是唯一的。在此例中,主键索引是id列。
  • 唯一索引(UNIQUE KEY):
    • 在key_name列中,自定义的索引名称(例如idx_name)表示这是一个唯一索引。non_unique列的值为0,说明唯一索引的值必须是唯一的,但允许NULL值。在此例中,唯一索引是name列。
  • 普通索引(KEY):
    • 在key_name列中,自定义的索引名称(例如idx_category)表示这是一个普通索引。non_unique列的值为1,说明普通索引允许重复值和NULL值。在此例中,普通索引是category列。
  • 前缀索引(KEY):
    • 前缀索引的识别方法与普通索引相同,但在sub_part列中有一个值,表示使用列值的前多少个字符作为前缀索引。在此例中,idx_name_prefix是一个前缀索引,它将name列的前10个字符作为索引。
  • 联合索引(KEY):
    • 联合索引可以通过key_name列中的相同索引名称以及不同的seq_in_index值来识别。在seq_in_index列中,数字表示列在联合索引中的顺序。在此例中,idx_category_price是一个联合索引,包括category和price两个列。
    • 在这两行中,key_name列的值都是idx_category_price,表明它们属于同一个索引。seq_in_index列的值分别为1和2,表示category和price这两个列在联合索引中的顺序。

注意,SHOW INDEX语句及返回的结果列可能会因MySQL版本的不同而有所差异。本解释基于MySQL 8.0版本。在其他版本中,返回的结果列可能有所不同。要获取与您的MySQL版本对应的详细信息,请查阅官方文档。