假设一个MySQL MyISAM表包含一千兆字节的数据和一千兆字节的索引。
此外,假设在开发过程中,列和索引将频繁地添加到表中或从表中删除。由于数据库的大小,使用标准的非调优MySQL设置时列/索引创建速度很慢。
应调整哪些MySQL服务器参数以最大限度地减少添加新列/索引所需的时间?
答案 0 :(得分:4)
我认为您应该关注的关键设置是key_buffer_size
,myisam_max_sort_file_size
和myisam_sort_buffer_size
。 key_buffer_size
是MyISAM最重要的设置之一,但其他两个可能需要一些解释。
来自http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html:
<强> myisam_max_sort_file_size 强>
临时的最大大小 允许MySQL使用的文件 同时重新创建MyISAM索引 (在REPAIR TABLE,ALTER TABLE或 LOAD DATA INFILE)。如果文件大小 将大于这个值, index是使用密钥缓存创建的 相反,哪个更慢。价值是 以字节为单位。
默认值为2GB。如果是MyISAM 索引文件超过此大小和磁盘 空间可用,增加了 价值可能有助于表现。
<强> myisam_sort_buffer_size 强>
缓冲区的大小 排序MyISAM索引时分配 在REPAIR TABLE期间或创建时 使用CREATE INDEX或ALTER的索引 表
最大允许设置 myisam_sort_buffer_size是4GB。
所以基本上,如果您希望索引大于myisam_max_sort_file_size
,您可能需要考虑调整它。如果没有,myisam_sort_buffer_size
可能值得关注。
请记住,在MyISAM表上创建索引会锁定整个表。如果您经常在大型桌面上执行此操作,则无论您调整了多少设置,都可能会出现严重的性能问题。
答案 1 :(得分:3)
以下是一些提示。
设置key_buffer_size
存储索引所需的内存。分配的大小应大于需要索引的列*行数所需的大小。在您的情况下,它应该大于1 GB
,因为您已经提到索引大小为1 GB。对于MyISAM Engine,索引可以存储在内存中,但不能存储在数据中。
如果需要在varchar
字段上创建索引,请限制用于索引的字节数。例如,如果一列是varchar(500)
,那么在此上创建索引将是一个过度杀戮,如果MySQL只能通过使用前几个字符将范围缩小到几个记录,那将毫无用处。例如5个字符。
为了添加新列,MySQL必须创建一个临时表并使用新列值复制所有数据。为避免这种情况,最好使用主表和新列中的主键创建新表。
希望这有帮助。