假设我们有一个具有以下结构的表:
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)的文档中可以清楚地看到,辅助索引引用的是主键。所以我的问题是:
发布于 2020-11-30 00:02:06
除了尼基塔说的.
“变更缓冲区”是一种优化。对非唯一索引的任何更改(insert/delete/update)都被抛到变更缓冲区中,该缓冲区(逻辑上)位于内存中的buffer_pool中。
当您使用非唯一索引时,它将同时检查更改缓冲区和该索引的实际BTree。该BTree的块被缓存在RAM中,所以查找可能完全在RAM中。
当您更改非唯一索引--索引的列(S)或附加的PK的列(S) --时,会在更改缓冲区中添加这样的简短指示。
在后台,一个进程将更改缓冲区条目刷新到实际的索引BTrees中。
因此,通过不停止更新非唯一索引的所有工作,更改缓冲区将加快写入速度。但是请注意,在完成写入之前,必须访问PRIMARY KEY (这是唯一的)和所有UNIQUE索引(即使还没有在RAM中缓存)。
您可以帮助最小化唯一索引的数量,并在较小程度上最小化表上的非唯一索引的数量。此外,通过不修改索引列。
假设您的示例是通过两个BTrees实现的:
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到另一个--任何一个方向。
https://dba.stackexchange.com/questions/280530
复制相似问题