我有一个MySQL数据库,我决定通过删除过时的数据来清除空间,并通过删除不必要的数据来提高性能。令我惊讶的是,删除了许多记录并优化了表后,性能下降了。我保留了旧数据库的副本,以便我可以进行性能比较。我使用不同的过滤器运行三次查询,我发现旧的巨大数据库在1.2秒内完成查询(我的php profiler处于活动状态),而新的清除数据库需要5.7秒才能运行完全相同的查询。查询是:
select org_members.id
from member_calendar, days, org_members
where org_members.org_id=1
and days.date="2017-07-02"
and days.removed=0
and org_members.removed=0
and member_calendar.day_id=days.id
and member_calendar.org_member_id=org_members.id;
或
select org_members.id
from org_members
INNER JOIN member_calendar ON member_calendar.org_member_id=org_members.id
INNER JOIN days ON member_calendar.day_id=days.id
where org_members.org_id=1
and days.date="2017-07-02"
and days.removed=0
and org_members.removed=0
我使用phpMyAdmin在两个dB中分析查询,主要变化是发送数据步骤从大dB中的617微秒变为净化后的2.2秒!其他步骤也越来越长,但这是巨大的差异。
使用对查询的解释,大dB显示与较小的序列不同的序列。两个结果显示:
较大的表命令表member_calendar在不使用密钥的情况下显示35943行,然后使用主键生成1行,然后使用主键产生1行,然后使用主键生成1行。
清除表查询是通过首先获取org_members而不使用主键并产生288行然后使用member_calendar而不使用键产生32695行然后使用主键并产生1行来运行的。
因此,似乎dB选择了一种不同的方式来运行查询,效率低得多。在执行使用较小数据库过滤主键但使用较大数据库的查询时,数据库丢弃了org_members表中主键的使用。关于它为什么会这样做以及如何纠正的任何想法?这是构造查询时应该解决的一般类型问题吗?我对这些结果感到非常惊讶。
我不知道接下来该做些什么来改善新数据库的情况。任何建议都会非常感激。
答案 0 :(得分:0)
我建议这是"过度规范化的情况"。一般而言,"连续"不应将诸如日期之类的内容移动到另一个表中。通常可以通过在需要的表格中以DATE
或DATETIME
作为日期来获得更好的效果。
此外,如果您使用的是ENGINE=MyISAM
,可能性能下降会提示您转移到InnoDB。
答案 1 :(得分:0)
以下是一些建议。