我的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我无法弄清楚如何扩展它。
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等中插入一个月的记录
答案 0 :(得分:0)
避免on c.location like concat('%', b.location_name, '%')
对表现有任何希望。
您的查询是否会搜索整个表格?如果是这样,你最终将受到IO限制,并且没有表现的希望。
您能否每天(或其他时间间隔)汇总新数据,从而避免查看大表?
INDEX(location, int_id, date_added)
按顺序将有所帮助。
请提供SHOW CREATE TABLE
;你提供的东西遗漏了太多细节。还提供整个查询。有了这些,我可能会对PARTITIONing
发表评论。 (分区不太可能对任何人有所帮助。)