当我为表创建压力数据时,我发现生成了以下文件。
-rw-rw---- 1 mysql mysql 8858 Jul 28 06:47 card.frm
-rw-rw---- 1 mysql mysql 7951695624 Jul 29 20:48 card.MYD
-rw-rw---- 1 mysql mysql 51360768 Jul 29 20:57 card.MYI
其实我在这张表中插入了1985968条记录。但索引文件大小令人难以置信。
表的结构是
create table card(
company_id int(10),
emp_number varchar(100),
card_date varchar(10),
time_entry text,
total_ot varchar(15),
total_per varchar(15),
leave_taken double,
total_lop double,
primary key (company_id,emp_number,card_date),
index (company_id,card_date)
);
有没有办法减少MYD的文件大小?
答案 0 :(得分:8)
请注意.MYI是您的索引,.MYD是您的数据。减小.MYD大小的唯一方法是删除行或更改列大小。
对于200万行的索引,50MB并不大。
让我们看一下表格的大小细分:
这给我们一个172 + time_entry字节的行长度。如果time_entry平均为100字节。你看272 * 2000000 = 544MB
对我而言,重要的是VARCHAR的数量。员工编号是否需要是varchar(100),甚至是varchar?当你索引整个列时,你在(company_id,emp_number,card_date)的索引中完整地复制了这些数据。
您可能不需要这里的varchar,并且您可能不需要它包含在主键中。
你真的需要time_entry成为一个TEXT字段吗?这可能是数据库中最大的空间消费者。
为什么使用varchar(10)作为卡片日期?如果你使用DATETIME,你只使用8字节而不是11字节,TIMESTAMP将是4字节,DATE将是3字节。
您还要为每个可以为NULL的列添加1个字节。
同时尝试运行ANALYZE / REPAIR / OPTIMIZE TABLE命令。
答案 1 :(得分:3)
很大程度上取决于time_entry文本字段的大小。我假设它很小,不到100个字节。然后你有大约4 + 100 + 10 + 100 + 15 + 15 + 8 + 8 =每条记录大约300字节的数据。你有200万条记录。我希望数据库是600兆字节。实际上,您在磁盘上的MYD中显示8000兆字节的数据,或者是12倍。有些事情不对。
您最好的诊断工具是show table status。特别是检查Avg_row_length和Data_length,它们可以让您深入了解空间的位置。
如果您正在使用MyISAM表,您可能会发现myisamchk将有助于缩小表格。如果您从数据库中插入并删除了大量行,则此工具尤其有用。 “优化表”也可以提供帮助。 MyISAM通过myisampack支持只读压缩表。不过,我认为这是最后的手段。