构造mysql大表

时间:2016-04-18 14:04:33

标签: mysql sql mariadb

我的mysql dababase表遇到了一些问题。我有一个脚本,每5,10分钟插入200行,包括date_inserted,我有一个查询,显示基于一些连接插入的最后记录(如4连接)。表格如下:

table : id, location, int_id, in, out, steps, date_added

我有这样的联接

...
join (
   select a.location, a.int_id, a.in, a.out, a .date_added
   from table a
   join (
      select location, int_id, max(date_added) as `date_added`
      from table
      group by location, int_id 
        ) b on b.location = a.location
          and b.int_id = a.int_id
          and b.date_added = a.date_added
) c on c.location like concat('%', b.location_name, '%')
    and c.int_id = b.interface_id
...

并且随着这个表格将增长到超过10百万,100百万记录,查询将运行缓慢。

减少此表大小的最佳方法是什么?我读了分区,但我不知道它是否;对我来说是最好的解决方案?还是?

也许每个月都要创建一个新的数据库或表?

我不想最终加入一张拥有100万条记录并且增加的表格。

非常感谢bbut我无法弄清楚如何扩展它。

更新1

id : int primary key auto_increment , location varchar, int_id int, in bigint, out bigint, steps varchar, date_added timestamp

我有一个日志服务器,每隔5分钟就会在数据库中保存一个位置名称,一个接口ID和一些bigint计数器,用于输入和输出(可以增加,但我可以重置它们),当前日期为insert。 我正在实时报告,在插入的最新日期看到这个计数器(如果我重置它们,它们将从0开始,不能使用max(in)或max(out)以便组加速选择)

问题是:这个半年的表格会增长太多,以至于这个实时报告会受到表格中行数的影响。拆分它们以保持报表速度有限的行的表的最佳方法是什么。我不想删除旧的计数器,因为我将创建一个数天/周/月的详细报告,但我不想只在一个表中有100百万条记录。我想创建一个月度数据库并在数据库2016_04_report,2016_05_report等中插入一个月的记录

1 个答案:

答案 0 :(得分:0)

避免on c.location like concat('%', b.location_name, '%')对表现有任何希望。

您的查询是否会搜索整个表格?如果是这样,你最终将受到IO限制,并且没有表现的希望。

您能否每天(或其他时间间隔)汇总新数据,从而避免查看大表?

INDEX(location, int_id, date_added)
按顺序

将有所帮助。

请提供SHOW CREATE TABLE;你提供的东西遗漏了太多细节。还提供整个查询。有了这些,我可能会对PARTITIONing发表评论。 (分区不太可能对任何人有所帮助。)