【问题标题】:List of used index coluns (mysql/mariadb)使用的索引列列表 (mysql/mariadb)
【发布时间】:2021-01-13 20:06:35
【问题描述】:

EXPLAIN 仅显示密钥长度。

例如:

我们在一个表上有一个复杂的索引。

IDX_KEY (col1, col2, col3)(让我们所有的列都是整数类型)

如果键长度(来自“解释”输出)= 4,则查询中仅使用 IDX_KEY 索引的 col1

如果为 8,则为 col1col2

如果为 12,则使用索引中的所有列。

我的问题:有没有一种方法可以在不计算的情况下确定列列表?

UPD:

真正的表有很多字段和索引。但是例如,让它有这样的定义:CREATE TABLE `tbl` (`col1` unsigned int not null,`col2` unsigned int not null,`col3` unsigned int not null, primary key (`col1`,`col2`,`col2`));

那么解释可以是这样的(如果只使用索引中的一列):

"id"  "select_type"  "table"  "type"   "possible_keys"  "key"      "key_len"  "ref"  "rows"  "Extra"
"1"   "PRIMARY"      "tbl"    "range"  "PRIMARY"        "PRIMARY"  "4"        \N     "1"     ""

【问题讨论】:

  • 请添加您的表定义和说明。我不明白您的问题“确定列列表”是什么意思?
  • @P.Salmon OP 想知道查询中使用了多列索引中的哪些列。可能是优化索引的有趣数据点。
  • 样本定义已添加到问题中
  • 解释和解释扩展没有这个信息。您是否尝试过跟踪优化器并查看该输出是否包含此信息?
  • 我只需要了解是否有任何方法可以在不使用 key_len 计算的情况下获取所选索引中使用的列列表。我还不需要做一些优化 - 只需获取列列表。

标签: mysql mariadb


【解决方案1】:

依赖密钥长度没有意义,因为它取决于所使用的存储引擎和 MariaDB 版本。在当前的 MariaDB 版本(10.5)和 InnoDB 中,密钥长度不是 4 而是 5。

要从优化器获取更多信息,您应该使用 ANALYZE 命令。将它与 FORMAT=JSON 一起使用(此功能自 MariaDB 10.1 起可用),它将为您提供一些更详细的信息,包括使用的密钥。

MariaDB [test]> analyze format=JSON select col1,col2,col3 from t2 where col1=1 and col2=2 \G
*************************** 1. row ***************************
ANALYZE: {
  "query_block": {
    "select_id": 1,
    "r_loops": 1,
    "r_total_time_ms": 0.082303568,
    "table": {
      "table_name": "t2",
      "access_type": "ref",
      "possible_keys": ["col1"],
      "key": "col1",
      "key_length": "10",
      "used_key_parts": ["col1", "col2"],
      "ref": ["const", "const"],
      "r_loops": 1,
      "rows": 1,
      "r_rows": 1,
      "r_table_time_ms": 0.027733218,
      "r_other_time_ms": 0.041487106,
      "filtered": 100,
      "r_filtered": 100,
      "using_index": true
    }
  }
}
1 row in set (0.001 sec)

附录:我之前没有看到Rick James的评论,EXPLAIN FORMAT=JSON也可以,如果你只需要使用过的键,你应该使用这个命令。

【讨论】:

  • 酷命令!不幸的是,它不适用于mysql,但它对我将来很有用。谢谢。
  • 但是 afaik MySQL 支持 EXPLAIN FORMAT=JSON
  • 是的,它返回的数据比analyze 多一点,但包含需要的数据。
  • 对于INT5表示该列是NULLable4表示NOT NULL
猜你喜欢
  • 2018-01-19
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 2015-07-24
  • 2018-10-02
  • 1970-01-01
相关资源
最近更新 更多