Mysql | 索引查询
发现了一个非常好用的方法,就是使用索引查询,
mysql 版本:8.x
1 查询语法
1.1 语法解读
1 | SHOW [EXTENDED] {INDEX | INDEXES | KEYS} |
语法解读
这是 SHOW INDEX
命令的完整语法,下面我将逐个解释每个部分:
SHOW
:这是开始执行命令的关键字。[EXTENDED]
:这是一个可选的关键字,如果使用了,它会显示隐藏的索引。{INDEX | INDEXES | KEYS}
:你可以选择其中任何一个关键字,它们都可以用来查看索引信息。这三个关键字在功能上是等价的。{FROM | IN}
:这两个关键字在这里的功能也是等价的,它们用来指定我们将从哪个表查看索引信息。tbl_name
:这是你想要查看索引信息的表的名称。[ {FROM | IN} db_name ]
:这是一个可选的部分,用来指定tbl_name
所在的数据库。如果你已经使用USE db_name;
选择了数据库,那么你可以省略这部分。[WHERE expr]
:这也是一个可选的部分,可以用来过滤结果。你可以提供一个条件表达式来限制返回的行。例如,你可以使用WHERE Key_name = 'PRIMARY'
来只显示主键的信息。
1 | SHOW INDEX FROM my_table FROM my_database WHERE Key_name = 'PRIMARY'; |
这个命令将显示数据库 my_database`` 中表
my_table`` 的主键信息。
1.2 提醒
An alternative to tbl_name FROM db_name syntax is db_name.tbl_name. 下面这两条语句是等价的。
1 | SHOW INDEX FROM mytable FROM mydb; |
2 结果字段
1 | mysql> show extended index from country in mybatis where Column_name = 'id' \G; |
下面针对查询结果中每个字段给出详细的解释:
Table
表名。Non_unique
如果索引不能包含重复项,则为0
;如果可以,则为1
。也就是我们平时所说的唯一索引Key_name
索引的名称,如果名字相同则表明是同一个索引,而并不是重复,名字相同的是联合索引。如果索引是主键索引,那么索引名称永远都是PRIMARY
Seq_in_index
索引中的列序号,对于多列索引,第一列为1
,第二列为2
,依此类推。Column_name
索引的列名。Collation
列在索引中的排序方式。有A(升序)
,D(降序)
,NULL(无排序)
。Cardinality
索引中唯一值的数目的估计值。对于非唯一索引,该值是NULL
。要更新这个数字,请运行ANALYZE TABLE
或(对于MyISAM
表)myisamchk -a
。我们知道某个字段的重复值越少越适合建索引,所以我们一般都是根据
Cardinality
来判断索引是否具有高选择性,如果这个值非常小,那就需要重新评估这个字段是否适合建立索引。Cardinality
越大,使用此索引的机会就越大。Sub_part
前置索引的意思,如果列只是被部分地编入索引,则为被编入索引的字符数。对于完全编入索引的列,此值为NULL
。Packed
MySQL 用来使索引更小的数据压缩方式。此值通常为NULL
。压缩一般包括压缩传输协议、压缩列解决方案和压缩表解决方案。Null
如果列可能包含NULL
值,则为YES
;否则,则为NO
。Index_type
使用的索引方法(例如BTREE, FULLTEXT, HASH, RTREE
)。Comment
索引列中未说明的有关索引的信息,例如,如果索引已禁用,则表示已禁用。Index_comment
这个字段包含了在创建索引时指定的注释。例如,在执行CREATE INDEX
或ALTER TABLE
语句时,你可以使用COMMENT
选项来添加注释。。Visible
这个字段在MySQL 8.0.12
及之后的版本中被引入。它表明索引是否是可见的。如果索引是可见的(Visible
的值为YES
),那么优化器可以选择使用这个索引来执行查
询。如果索引是不可见的(Visible
的值为NO
),那么优化器将不会使用这个索引来执行查询。Expression
关于索引的一些注解信息。
请注意,如果你要查看的表在一个特定的数据库中,你可能需要先使用 USE database_name;
来选择那个数据库。