【问题标题】:How to get index value for specific table from mysql?如何从mysql获取特定表的索引值?
【发布时间】:2018-11-22 02:04:13
【问题描述】:

如何从 MySQL 获取特定表的 mysql index 值?

"大多数 MySQL 索引(PRIMARY KEY、UNIQUE、INDEX 和 FULLTEXT)是 存储在 B 树中。”

您可以在文档中查看它是 B 树吗?

【问题讨论】:

  • 这是查找索引信息的方法。现在的问题是如何获取特定的索引 BTREE 对象(值)。得到这个 BTREE 后,我将遍历它。目前我不知道如何获得 BTREE。
  • 遍历是什么意思?
  • 这并不重要,因为我需要先以某种方式获得 BTREE。

标签: mysql indexing pagination cursor


【解决方案1】:

研究 B 树。更具体地说,B+树。

让我们通过 BTree 索引搜索单个项目。 BTree 有一个根节点;从那里开始。它可能有 100 个指向子节点的链接以及每个子节点的价值范围信息。您进入适当的子节点。对于一张小桌子,你就完成了。但是对于一张巨大的桌子,你重复这个过程几次。 (对于具有 trillion 行的表,可能需要 6 次迭代。)完成。你已经找到了你想要的那一行。

现在,让我们获取一个“范围”的行。 (例如:WHERE id BETWEEN 1234 and 9876WHERE name LIKE 'T%' 执行上述操作以找到范围的第一个,然后转到您所在的底部(“叶”)节点中的“下一个”记录。这很好,直到你用完叶节点中的记录。

B+Tree 中的+ 是如何起作用的。这意味着从这个节点到底层的“下一个”节点有一个链接。所以继续范围查询是相当快的。

百万行表的统计数据,“扇出”为 100:

要查找特定项目:需要触及 3 个节点(在 InnoDB 的情况下为 16KB 块)。

获取 500 个连续行:3 个节点开始;然后再向前扫描大约 5 个。

比较... 如果没有索引,您将需要扫描大约 10,000 个块 (1M/100) 的整个表。这对于上述任一假设查询都是必需的。

在 InnoDB(在 MySQL 中)中,几乎所有您创建的键都是 PRIMARY KEY、UNIQUE 和 INDEX。那些是B+树;没有选择(与其他供应商不同)。除此之外,FULLTEXT 中还有 SPATIAL;它们更复杂。

如果你执行SHOW CREATE TABLE foo,你会得到一些关于索引的信息。 `information_schema 有更多信息。

【讨论】:

  • 我对知道索引是 btree 还是其他方式或 sql 如何遍历节点的日常价值表示怀疑。在一天结束时,你告诉 sql 你想要什么,优化器决定如何做你想要的,包括是否使用索引。
  • B+Trees 非常适合“点查询”和“范围查询”。尽管如此,优化器可能有效地选择忽略您的索引。示例:无论如何都需要大多数行;在索引 BTree 和数据之间跳动比简单地扫描所有数据要慢。
  • 这是很好的信息。这就是为什么我需要以某种方式获取 B+Trees 对象的原因。所以我以后可以操纵它。很多人可能不明白我需要什么。谢谢@RickJames,你得到了我的支持。
  • @P.Salmon - 是的,TMI。有时我想提供太多信息。我的评论是“执行摘要”——对大多数人来说已经足够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-31
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 2022-06-23
  • 1970-01-01
  • 2022-11-23
相关资源
最近更新 更多