如何获取在新行插入期间更新索引所花费的时间 MySQL 的统计信息
How to get statistics on time MySQL spent updating indexes during a new row insertion
我试图弄清楚多个索引实际上是如何影响 MySQL InnoDB 表的插入性能的。
是否可以使用 performance_schema 获取有关索引更新时间的信息?
似乎没有任何阶段的工具可以反映此类信息。
即使有performance_schema,也是不完整的
Non-UNIQUE 二级索引是这样处理的:
INSERT
开始。
- 任何
UNIQUE
索引(包括 PRIMARY KEY
)都会立即检查 "dup key"。
- 其他索引变化放入"change buffer".
- 给客户端
INSERT
returns
更改缓冲区是 buffer_pool(默认值:25%)的一部分,其中保存了此类索引修改。最终,它们将被分批更新索引的 BTree 的实际块。
在好的情况下,许多索引更新将组合成很少的读取-修改-写入步骤来更新块。在糟糕的情况下,每个索引更新都需要单独的读取和写入。
更改缓冲区的 I/O 已完成 'in the background' 以及对数据块的任何更改的最终写入。这些无法以任何方式实际监控——尤其是如果有不同的客户端对同一索引或正在更新的数据块进行不同的查询。
哦,与此同时,任何索引查找都需要在磁盘上(或缓存在 buffer_pool 中)块 和 更改缓冲区中查找。这使得索引查找更快或更慢,具体取决于与手头操作无关的各种事情。
我试图弄清楚多个索引实际上是如何影响 MySQL InnoDB 表的插入性能的。
是否可以使用 performance_schema 获取有关索引更新时间的信息?
似乎没有任何阶段的工具可以反映此类信息。
即使有performance_schema,也是不完整的
Non-UNIQUE 二级索引是这样处理的:
INSERT
开始。- 任何
UNIQUE
索引(包括PRIMARY KEY
)都会立即检查 "dup key"。 - 其他索引变化放入"change buffer".
- 给客户端
INSERT
returns
更改缓冲区是 buffer_pool(默认值:25%)的一部分,其中保存了此类索引修改。最终,它们将被分批更新索引的 BTree 的实际块。
在好的情况下,许多索引更新将组合成很少的读取-修改-写入步骤来更新块。在糟糕的情况下,每个索引更新都需要单独的读取和写入。
更改缓冲区的 I/O 已完成 'in the background' 以及对数据块的任何更改的最终写入。这些无法以任何方式实际监控——尤其是如果有不同的客户端对同一索引或正在更新的数据块进行不同的查询。
哦,与此同时,任何索引查找都需要在磁盘上(或缓存在 buffer_pool 中)块 和 更改缓冲区中查找。这使得索引查找更快或更慢,具体取决于与手头操作无关的各种事情。