1 mysql
当我为表创建压力数据时,我发现生成了以下文件.
-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
Run Code Online (Sandbox Code Playgroud)
其实我在这张表中插入了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)
);
Run Code Online (Sandbox Code Playgroud)
有没有办法减少MYD的文件大小?
请注意.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命令.