【问题标题】:How to Create Multi-level Index in MySql and how to find out a column is Multi-level indexed?如何在 MySql 中创建多级索引以及如何找出列是否被多级索引?
【发布时间】:2018-06-21 19:31:36
【问题描述】:

我有一张表'activities'。它包含大约 100 万条记录。它的列包括关闭,

id(PK)、u_id(FK)、cl_id(FK)、activity_log

默认情况下 id(PK) 已编入索引,并且我已通过使用为 u_id 和 cl_id 创建了自己的索引,

ALTER TABLE activities ADD INDEX(u_id,cl_id);

现在我想为 cl_id(FK) 或 id(PK) 或如果可能的话为这两个列创建一个多级索引。如何使用查询创建多级索引?

如何找出表中被多级索引的列?我试过这个查询,但它只显示被索引的列,

SHOW indexes FROM activities;

多级索引和非聚集索引是一样的吗?

【问题讨论】:

  • 多级索引?那到底应该是什么?
  • 我只是夸大了这篇文章,但这与 MySQL 索引无关。 MySQL(或我知道的任何其他数据库)中没有多级索引。如果您对 MySQL 中的索引如何工作感兴趣,我可以推荐这个网站:use-the-index-luke.com

标签: mysql indexing database-performance non-clustered-index


【解决方案1】:

我不知道什么是“多级”索引。但是有“复合”索引,例如

INDEX(last_name, first_name)

非常有用

WHERE last_name = 'James'
  AND first_name = 'Rick'

甚至

WHERE last_name = 'James'
  AND first_name LIKE 'R%'

在 MySQL(尤其是 InnoDB)中,PRIMARY KEY 始终是唯一索引,它与数据“聚集”在一起。即通过PK查找一行是非常高效的。结构始终为 BTree。

“Secondary keys”也是BTrees,但是叶子节点包含PK。因此,需要进行第二次查找才能完成查询。 (这种区别很少一文不值。)

PK 和/或辅助密钥可以是“复合的”。

如果没有以 FK 中的列开头的合适的(PRIMARY 或二级)索引,则声明 FOREIGN KEY 会添加二级索引。

以下是多余的,应该避免:

PRIMARY KEY(id),
INDEX(id)           -- DROP this

索引顺序

哎哟!近二十年来我还没有听说过那种过时的索引方法。

该问题提供了一个链接,例如“多级”索引的定义。逃离它!换学校。或者至少明白 IS 不再被认为是可行的。

MySQL 使用“BTrees”进行大多数索引。它是几十年前发明的,基本上消灭了索引顺序。而且,在很大程度上,Hashing 作为一种磁盘索引技术已经被淘汰了。

MySQL 的 BTree 可以处理多个列,如我上面的示例所示。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2020-07-24
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多