我安装了MariaDB服务器,其中一些表使用MyISAM,其中一些使用InnoDB。 InnoDB有利于减少查询时间,因为它是多核的。我把一些巨大的表改成了InnoDB。
然后我发现我的硬盘正在使用越来越多的空间。我检查了我的CentOS 7 Linux,发现ibdata1占用了我的硬盘空间。而且我知道如果我需要缩小我需要的空间来将MySQL服务器完全转储到.sql文件中,然后删除所有数据库。之后,停止MySQL服务器并删除ibdata1文件。此外,将innodb_file_per_table
设置为my.cnf
。最后,将sql导回服务器。
一切顺利,直到我发现这个问题。
我实时检查我的新HDD使用情况,并且我意识到该表现在使用名称与表名相同的.ibd文件。这是巨大的!完成导入后,硬盘使用率甚至比以前更差。我试过OPTIMIZE TABLE
获取一个750MB的文件,看看它是否可以缩小尺寸但没有运气。我还有一个14.8GB的InnoDB表,但我没有另外14.8GB的MySQL来优化我的表,我不认为它可以减少使用。
目前my.cnf
[mysqld]
local-infile = 0
max_connections = 32768
long_query_time = 5
query_cache_type = ON
query_cache_size = 200M
tmp_table_size = 2M
max_heap_table_size = 64M
myisam_sort_buffer_size = 64M
table_open_cache = 4096
thread_concurrency = 28
sort_buffer_size = 16M
read_buffer_size = 16M
join_buffer_size = 16M
innodb_file_per_table
innodb_flush_method = O_DIRECT
innodb_log_file_size = 1G
innodb_buffer_pool_size = 4G
innodb_read_io_threads = 7
innodb_write_io_threads = 7
我现在能做什么?
答案 0 :(得分:1)
简短回答:InnoDB表(和索引)使用的磁盘空间大约是MyISAM所需的磁盘空间的2倍-3倍。这是可以忍受的。
答案很长:
如果您没有一堆备用磁盘空间,那么转换到InnoDB最终会耗尽空间,无论file_per_table等等。
innodb_file_per_table = OFF
:所有后续 CREATEd
或ALTERed
表的所有数据和索引都会进入文件ibdata1
。那个文件只会增长;它不能缩小。
innodb_file_per_table = ON
:所有后续 CREATEd
或ALTERed
表的所有数据和索引都会转到.ibd
个文件中表的名称。通常,这是更好的方法,因为从长远来看,它可以实现更好的维护。
无论哪种方式,都会占用相似数量的磁盘空间。
其他问题:
query_cache_size = 200M
伤害表现;不要超过大约50M。ALTERs
和所有OPTIMIZEs
复制了表格。因此,在操作期间,您需要足够的磁盘空间来存储表的额外副本。使用ibdata1
时,这将扩展但不合同,即该文件的大小。使用.ibd
,空间将返回给操作系统。ALTER
和OPTIMIZE
可能会也可能不会缩小表格和索引的大小(并增加Data_free
)。 OPTIMIZE
几乎从未对InnoDB有用。ibdata1
而不是file_per_table
。但这很麻烦 - 我必须提前思考。