首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySql(InnoDB)如何更新次要的非唯一索引?

MySql(InnoDB)如何更新次要的非唯一索引?
EN

Database Administration用户
提问于 2020-11-29 14:44:54
回答 1查看 591关注 0票数 0

假设我们有一个具有以下结构的表:

代码语言:javascript
复制
CREATE TABLE Persons (
    PersonID int NOT NULL PRIMARY KEY,
    LastName varchar(255),
    FirstName varchar(255)
);
CREATE INDEX Lastname ON Persons (LastName);

另外,您可以注意到我们有一个名为Lastname的次要索引。

从MySql(InnoDB engine)的文档中可以清楚地看到,辅助索引引用的是主键。所以我的问题是:

  1. 如果我们更新主键会发生什么?InnoDB如何快速更新所有辅助索引条目?是否有从主键索引页到所有辅助索引页的引用?
  2. 如果我们更新字段"LastName“会发生什么?由于辅助索引是非唯一的,MySQL如何搜索要在辅助索引中更新的页面?看起来应该有一个从PK索引到给定行的所有辅助索引页的引用。但是我在MySql的文档中找不到明确提到这一点的地方。
EN

回答 1

Database Administration用户

发布于 2020-11-30 00:02:06

除了尼基塔说的.

“变更缓冲区”是一种优化。对非唯一索引的任何更改(insert/delete/update)都被抛到变更缓冲区中,该缓冲区(逻辑上)位于内存中的buffer_pool中。

当您使用非唯一索引时,它将同时检查更改缓冲区和该索引的实际BTree。该BTree的块被缓存在RAM中,所以查找可能完全在RAM中。

当您更改非唯一索引--索引的列(S)或附加的PK的列(S) --时,会在更改缓冲区中添加这样的简短指示。

在后台,一个进程将更改缓冲区条目刷新到实际的索引BTrees中。

因此,通过不停止更新非唯一索引的所有工作,更改缓冲区将加快写入速度。但是请注意,在完成写入之前,必须访问PRIMARY KEY (这是唯一的)和所有UNIQUE索引(即使还没有在RAM中缓存)。

您可以帮助最小化唯一索引的数量,并在较小程度上最小化表上的非唯一索引的数量。此外,通过不修改索引列。

假设您的示例是通过两个BTrees实现的:

代码语言:javascript
复制
person_id, last_name, first_name
    Unique index on person_id,
    ordered by person_id
last_name, person_id
    Not unique on last_name,
    unique on the pair of columns
    ordered by the pair.

对person_id或last_name值的任何更改都需要修改两个BTrees。只有数据BTree需要更改,如果first_name更改的话。

插入和删除都需要对BTrees进行修改。

尼基塔解释了如何从一个BTree到另一个--任何一个方向。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/280530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档