当前位置: 首页 > news >正文

MySQL索引查看语句show index详解

一、概述

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;

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

+----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table    | Non_unique | Key_name           | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| examples |          0 | PRIMARY            |            1 | id          | A         |           0 |     NULL |   NULL |      | BTREE      |         |               | YES     |       NULL |
| examples |          0 | idx_name           |            1 | name        | A         |           0 |     NULL |   NULL | YES  | BTREE      |         |               | YES     |       NULL |
| examples |          1 | idx_category       |            1 | category    | A         |           0 |     NULL |   NULL | YES  | BTREE      |         |               | YES     |       NULL |
| examples |          1 | idx_category_price |            1 | category    | A         |           0 |     NULL |   NULL | YES  | BTREE      |         |               | YES     |       NULL |
| examples |          1 | idx_category_price |            2 | price       | A         |           0 |     NULL |   NULL | YES  | BTREE      |         |               | YES     |       NULL |
| examples |          1 | idx_name_price     |            1 | name        | A         |           0 |       10 |   NULL | YES  | BTREE      |         |               | YES     |       NULL |
+----------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

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版本对应的详细信息,请查阅官方文档。

五、拓展

  1. 索引重复检测(SQL直接查)
-- 快速定位重复索引
SELECT table_name,GROUP_CONCAT(column_name ORDER BY seq_in_index) AS columns
FROM information_schema.statistics
WHERE table_schema = '你的数据库名'
GROUP BY table_name
HAVING COUNT(*) > 1;
  1. 索引碎片率计算
-- 计算索引碎片率(>30%建议优化)
SELECT table_name,ROUND((data_length + index_length) / 1024 / 1024, 2) AS total_mb,ROUND((data_free) / 1024 / 1024, 2) AS free_mb,ROUND((data_free / (data_length + index_length + data_free)) * 100, 2) AS frag_ratio
FROM information_schema.tables
WHERE table_schema = '你的数据库名'
AND data_free > 0;
  1. 强制更新统计信息
-- 解决Cardinality不准问题
ANALYZE TABLE user;
http://www.jsqmd.com/news/17358/

相关文章:

  • qzmoot 生活合集
  • yocto工程升级要点
  • 微信机器人开发API!3步搞定微信聊天机器人
  • 详细介绍:【Linux】Linux管道与进程池深度解析:从原理到实战
  • windows2019的域控服务器更新时间.251020
  • 国内DOH解析速度测试(阿里 腾讯 360 Doh测速)
  • WatchAlert 轻量级AI日志告警 - Docker安装部署
  • 对话智能体泛化研究在线挑战启动
  • 请求
  • 麒麟和win10双系统出现时间差异的问题
  • dlc — Docker Log Cleaner(支持名称、ID前缀、交互序号清理,模糊匹配交互确认)
  • 软件研发项目管理提效方案|流程驱动 数据赋能:打造上下游信息透明的研发项目管理新模式
  • 第二周记
  • 【分享】一篇文章让你学通JFinal的各种参数解析方式
  • 2025年10月深度seek排名优化服务排行榜:十大服务商综合对比与选择指南
  • NetSuite-WMS瀚钰通仓库对接使用说明
  • 2025年10月deepseek排名优化服务推荐排行榜:十家服务商综合评测与选择指南
  • 案例分析:MySQL 并行复制竟然比单线程慢?
  • 克服keepalived的主备服务器都持有VIP——出现脑裂现象
  • Codeforces Round 1060 (Div. 2) A - C2
  • 2025年10月深度关键词排名优化服务推荐排行榜:十大服务商综合对比与评测分析
  • 2025年10月DeepSeek关键词排名优化服务排行榜深度评测与对比分析
  • 钥匙
  • 2025深大电协软件部招新个人题解(部分)
  • 2025 硅钢片实力厂家最新推荐榜:聚焦 400 万只产能与 0.3mm 精度,解析专利技术与上市公司合作背景
  • 2025 年铁芯源头厂家最新推荐排行榜:精准工艺 + 全场景适配实力甄选,年销 400 万只 + 优质企业权威盘点环形铁芯/互感器铁芯厂家推荐
  • MATLAB实现DLT645协议
  • Maui 实践:让 JavaScript 的 this 怪物如同邻居家(强类型)的乖孩子
  • [251020 699mAh] 模拟赛破防有感 2.0
  • 2025 年速冻机源头厂家最新推荐榜单:涵盖隧道式、大型、全自动、螺旋、箱式柜式小型等多类型设备,助力食品加工企业选优质供应商