gpt4 book ai didi

mysql - 当使用 MySQL 定义的隐藏 ROW_ID 列作为 PK 时,哪些版本的 MySQL 会受到可伸缩性问题的影响?

转载 作者:行者123 更新时间:2023-11-29 22:03:28 32 4
gpt4 key购买 nike

将 MySQL 与 InnoDB 存储结合使用时,如果表没有显式主键 (PK) 且没有唯一索引,则会导致将隐藏的 ROW_ID 列添加到这些表中,从而引入隐式 PK ( http://dev.mysql.com/doc/refman/5.6/en/innodb-index-types.html )。然而,我读到,隐式 PK 意味着可扩展性问题,因为 (1) ROW_ID 值的全局序列计数器和 (2) 需要锁定 dict_sys->mutex 来递增计数器。请参阅以下页面了解更多详细信息:

http://blog.jcole.us/2013/05/02/how-does-innodb-behave-without-a-primary-key/

https://www.percona.com/blog/2013/10/18/innodb-scalability-issues-tables-without-primary-keys/

这些限制是否适用于所有版本的 MySQL?如果不是,哪些版本的 MySQL 不依赖全局计数器(而不是每个表一个)和高要求的互斥体来实现隐藏的 ROW_ID 列?

谢谢!

最佳答案

我决定亲自查看 MySQL 5.6 和 5.7 的源代码,我发现即使是最新的 MySQL 5.7 仍然存在我在问题中描述的“默认 PK”的限制:

MySQL 5.6:相关文件: https://github.com/mysql/mysql-server/blob/5.6/storage/innobase/dict/dict0boot.cc

MySQL 5.7:相关文件: https://github.com/mysql/mysql-server/blob/5.7/storage/innobase/dict/dict0boot.cc

两种情况下的相关代码片段:

void
dict_hdr_flush_row_id(void)
/*=======================*/
{
dict_hdr_t* dict_hdr;
row_id_t id;
mtr_t mtr;

ut_ad(mutex_own(&(dict_sys->mutex)));

id = dict_sys->row_id;

mtr_start(&mtr);

dict_hdr = dict_hdr_get(&mtr);

mlog_write_ull(dict_hdr + DICT_HDR_ROW_ID, id, &mtr);

mtr_commit(&mtr);
}

关于mysql - 当使用 MySQL 定义的隐藏 ROW_ID 列作为 PK 时,哪些版本的 MySQL 会受到可伸缩性问题的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32386311/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com