为什么MYD文件的大小如此之高?

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的文件大小?

hob*_*ave 8

请注意.MYI是您的索引,.MYD是您的数据.减小.MYD大小的唯一方法是删除行或更改列大小.

对于200万行的索引,50MB并不大.

我们来看一下表格的大小细分:

  • company_id - 4个字节
  • emp_number - 101字节
  • card_date - 11个字节
  • total_ot - 17个字节
  • total_per - 17个字节
  • leave_taken - 9个字节
  • total_lop - 9个字节
  • time_entry - avg(length(time_entry))+ 3个字节

这给了我们一个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命令.