最好的 MyISAM 和 InnoDB

Ric*_*mes 17 mysql innodb myisam performance index

由于 RAM 的限制,是否可以让 InnoDB 使用与 MyISAM 相同的索引而不是聚集索引,同时获得其并发性能的好处?

Rol*_*DBA 14

所述gen_clust_index InnoDB的发动机罩下(聚簇索引)容纳主键的条目与沿的rowid。使用 gen_clust_index 的有趣之处在于,您创建的任何非唯一索引将始终具有表的 gen_clust_index 对应的 rowid。因此,总是有双索引查找,一个用于二级索引,另一个用于 gen_clust_index。

由于 gen_clust_index 或至少是边缘结果,任何改进表或主键布局的尝试都将无效。

例子

有些人试图按 PRIMARY KEY 顺序对 MyISAM 进行排序。根据MySQL 数据库设计和调优,第 236 页第 7 段,在副标题“按索引顺序存储表”下:

如果您经常从表中检索大范围的索引数据或对同一索引键的结果进行一致排序,您可能需要考虑使用 --sort-records 选项运行 myisamchk。这样做告诉 MySQL 按照与索引相同的物理顺序对表的数据进行排序,并有助于加快这些类型的操作。或者,您可以将 ALTER TABLE 语句与特定列选项的 ORDER BY 结合使用,以获得相同的结果。

当然,这对MyISAM有效并且有效。您可以对 InnoDB 执行 ALTER TABLE ... ORDER BY col1,col2,...,coln,其中列可能是也可能不是 PRIMARY KEY 的列。这不会为 InnoDB 产生更快的结果,因为……没错……您每次都必须查阅 gen_clust_index 。

有些人可以使表的行格式 FIXED 使用,ALTER TABLE mydb.mytb ROW_FORMAT=Fixed;并且可以在不进行任何其他更改的情况下将读取性能提高 20%。这对MyISAM有效并且有效。这不会为 InnoDB 产生更快的结果,因为……没错……您每次都必须查阅 gen_clust_index 。

您可以对名为 mydb.mytb 的 InnoDB 表执行以下操作:

CREATE TABLE mydb.mytc LIKE mydb.mytb;
INSERT INTO mydb.mytc SELECT * FROM mydb.mytb ORDER BY col1,col2,...coln;
ALTER TABLE mydb.mytb RENAME mydb.mytd;
ALTER TABLE mydb.mytc RENAME mydb.mytb;
DROP TABLE mydb.mytd;
Run Code Online (Sandbox Code Playgroud)

这将在 gen_clust_index 中按 rowid 顺序放置表。这最多可能会为 InnoDB 产生边际结果,因为……没错……您每次都必须咨询 gen_clust_index 。

现在,让我们有点可笑。有一个 NoSQL 接口来查询(仅限 SELECT)MyISAM 和 InnoDB,称为HandlerSocket(以前称为 HANLDER)接口。这使您可以访问数据,从而绕过所有 SQL、ACIDMVCC协议。虽然有可能,但恕我直言,代码和维护太复杂了。AFAIK 没有任何内容说明 HandlerSocket 接口是否与 gen_clust_index 交互。

总之,有很多方法可以给猫剥皮。在这种情况下,您无法抓住猫(gen_clust_index)。我想这就是为什么 MyISAM 因其读取性能、表排序的灵活性、表行格式以及支持它的工具而继续存在的原因。InnoDB 将继续围绕其符合 ACID 的特性进行设计,直到某个勇敢的人获取 InnoDB 源代码并将其转换为兼具 MyISAM 和 InnoDB 优点的东西