带key_block_size的MyISAM表集
我们有一台带有AWS RDS(版本5.6.34)的MySQL服务器。我们只使用MyISAM表格。我试图改变key_block_size来增加IO吞吐量。但是,有两个意想不到的结果。带key_block_size的MyISAM表集
1>如果将key_block_size设置为索引级别(例如8192),那么当执行完成时,表将转入InnoDB,这不是我想要的。要将表更改回MyISAM,我必须删除索引(es)。
2>如果将key_block_size设置为表级别(例如16384),则需要很长时间才能构建索引。所花费的时间至少比没有设置key_block_size时留下的时间长很多。
有关可能发生的事情和原因的任何想法?我应该玩的价值,即。 key_block_size,用于MyISAM表?
非常感谢您的任何见解。
默认密钥块大小为1K。操作系统喜欢4K。如果您的索引访问是随机,越小越好。如果你在索引范围内扫描,越大越好。
使key_buffer_size
太大从数据的缓存中取走。使它太小会导致更多的索引I/O。你不小心打破了这个平衡?
我从来没有听说过ENGINE
被自动更改。请提供更多细节。评论中的测试用例用Percona的5.6.22-71.0-log的MyISAM表格返回,并且确实保留KEY_BLOCK_SIZE=8192
。 (我没有尝试AWS。)哦,我想我发现它:SHOW VARIABLES LIKE '%engine%';
嗯...更改日志为Percona 5.7.10-1说:“运行ALTER TABLE
没有指定存储引擎(没有ENGINE=
子句)或OPTIMIZE TABLE
当enforce_storage_engine
已启用可能会导致未被请求和意外的存储引擎更改,如果为系统表执行,则会绕过常规系统表存储引擎兼容性检查,导致崩溃或以其他方式破坏服务器操作。修复了错误#1488055。
有一个棘手的方法让MyISAM通过“排序”而不是通过“key_buffer”来重建索引。 (SHOW PROCESSLIST
向你显示它在做什么。)(它说它是“修复”。)“排序”通常要快得多,并且避免了key_buffer。
检查值delay_key_write
。
在MyISAM中,PRIMARY KEY
被视为另一个索引。我是InnoDB,它与数据聚集在一起,所以不会在Index_length
中出现。
有很多优化和I/O提示。 但是它们比查询更依赖于调优。请提供查询,EXPLAIN SELECT ...
,内存大小和SHOW CREATE TABLE
。另外,我们来看看SHOW VARIABLES LIKE '%buffer%';
。
如果您想要更多评论,请提供SHOW VARIABLES;
和SHOW GLOBAL STATUS;
。
分析 - 也许“汇总表”是要走的路?有时,这会提高10倍的性能。
分析 - 当您可以通过集群PK进行扫描时,InnoDB会比MyISAM获得更好的性能,而MyISAM必须在单独的索引和数据之间来回跳动。和/或必须进行单独的排序。
Oracle一直在不断改进InnoDB,以至于在几乎所有情况下都宣称它比MyISAM更好。其余缺陷:磁盘空间;计数(*)没有地方; 2部分PK。 (没有看到你的分析,我不能说InnoDB是否真的会为你更快,他们也不能。)
目前还不清楚你在做什么。 1)不应该将表更改为InnoDB(实际上,InnoDB不支持每个索引的'key_block_size')。 2)目前尚不清楚哪些指标需要更多时间:新的还是现有的指标?如果更改表格设置,则必须重建整个表格,因此需要比添加单个索引更多的时间。所以你可以更具体一些:添加(或者说:一个小样本)'create table'语句,你运行的命令和生成的'show create table'。通常:在提高性能的检查清单中,'key_block_size'是条目142.你已经完成了1-141吗? – Solarflare
MyISAM即将死亡。我从来没有听说过任何成功更改key_block_size的人。没有支持。 –
@Solarflare,在AWS RDS中运行以下语句将导致将MyISAM表转换为InnoDB表: CREATE TABLE'test_tbl1'( 'row_id' int(11)NOT NULL DEFAULT'0', 'row_detail' int (11)NOT NULL DEFAULT'0', KEY'idx'('row_id') )ENGINE = MyISAM DEFAULT CHARSET = latin1; ALTER TABLE'test_tbl1' DROP INDEX'idx', ADD UNIQUE INDEX'idx2' USING BTREE('row_id' ASC)KEY_BLOCK_SIZE = 8192; – TonyS