数据清除后,MySQL数据库性能下降

时间:2017-05-07 20:40:35

标签: php mysql database-design

我有一个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表中主键的使用。关于它为什么会这样做以及如何纠正的任何想法?这是构造查询时应该解决的一般类型问题吗?我对这些结果感到非常惊讶。

我不知道接下来该做些什么来改善新数据库的情况。任何建议都会非常感激。

2 个答案:

答案 0 :(得分:0)

我建议这是"过度规范化的情况"。一般而言,"连续"不应将诸如日期之类的内容移动到另一个表中。通常可以通过在需要的表格中以DATEDATETIME作为日期来获得更好的效果。

此外,如果您使用的是ENGINE=MyISAM,可能性能下降会提示您转移到InnoDB。

答案 1 :(得分:0)

以下是一些建议。

  1. 解释两个查询并检查是否使用了正确的索引。
  2. 重建索引。
  3. 如果在此表中您同时读取/插入数据,则将表引擎类型更改为innodb而不是myism,因为myism执行表锁定会减慢选择和读取速度。