mysql - 如何从mysql获取特定表的索引值?

标签 mysql indexing pagination cursor

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

"Most MySQL indexes (PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT) are stored in B-trees."

正如您可以在文档中查看的那样,它是 B 树?

最佳答案

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

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

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

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

“扇出”为 100 的百万行表的统计信息:

要查找特定项目:需要触及 3 个节点(在 InnoDB 中为 16KB block )。

要获取 500 个连续行:需要 3 个节点才能到达开头;然后再向前扫描大约 5 个。

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

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

如果您执行SHOW CREATE TABLE foo,您将获得一些有关索引的信息。 `information_schema 有更多信息。

关于mysql - 如何从mysql获取特定表的索引值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53400402/

相关文章:

mysql - 如何在 IntelliJ 2016.2.5 中安装 SQL & 如何创建 SQL IntelliJ 项目

mysql 联合与 joomla

sql - 索引是否用于嵌套选择中的 'outer' 和 'inner' where 子句?

ruby-on-rails - 没有 gem 的分页 Next, Previous, Name.order( :id). limit(10).offset(0) 的按钮

mysql - 如何查询多行的平均时差?

mysql - VB.NET 2010 和 MySql - 为懒惰的人处理 DB NULL

sql - Postgres pg_trgm GIN 索引在特定连接中被忽略

sql-server - 如何使用 SQL 查询降低聚集索引扫描成本

Angular:我将如何链接 Mat-paginator 的 pageSize 来呈现该数量的项目?

android - 在 NestedScrollView 中使用分页的 RecyclerView