Mysql中Innodb引擎表的默认主键_rowid

今天面试被问到一个问题:Innodb引擎创建表的时候,没有创建主键,mysql会怎么样?用普通索引查询数据是全表扫描吗?于是就翻了一下mysql的资料。

mysql的技术文档里面有如下文字:

If you do not define a PRIMARY KEY for your table, MySQL picks the first UNIQUE index that has only NOT NULL columns as the primary key and InnoDB uses it as the clustered index. If there is no such index in the table, InnoDB internally generates a clustered index where the rows are ordered by the row ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order. 

Innodb表中在没有默认主键的情况下会生成一个6byte空间的自动增长主键,可以用select _rowid from table来查询。当在表里设置了主键之后,_rowid就是对应主键,select _rowid from table查询的是对应的主键值。

所以,Innodb引擎中没有创建主键时,普通索引查询数据不是全表扫描的,普通索引B+树的叶子节点存放的是这个默认的_rowid 自动增长主键。

 

                                                                                                2020年07月11日 晚 于北京记

你可能感兴趣的:(mysql)