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

Php 数据清除后MySQL数据库性能下降,php,mysql,database-design,Php,Mysql,Database Design,我有一个MySQL数据库,我决定通过删除过时的数据来清除它,以节省空间,并通过删除不必要的数据来提高性能。令我惊讶的是,在删除了许多记录并优化了表之后,性能下降了。我保存了一份旧数据库的副本,以便进行性能比较。我使用不同的过滤器运行了三次查询,发现旧的大型数据库在1.2秒内完成查询(我的php profiler处于活动状态),而新的已清除数据库运行完全相同的查询需要5.7秒。查询是: select org_members.id from member_calendar, days, org_me

我有一个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;


我使用phpMyAdmin在两个数据库中分析查询,主要的变化是发送数据的步骤从大数据库中的617微秒变为清除数据库中的2.2秒!其他步骤也逐渐变长,但这是巨大的区别


在查询中使用explain,大数据库显示的序列与小数据库不同。这两个结果表明:

  • 较大的表命令tables member_calendar使用35943行而不使用键,然后使用主键命令org_成员产生1行,然后使用主键命令days产生1行

  • 清除的表查询是通过以下方式运行的:首先获取不使用主键的org_成员并产生288行,然后获取不使用键的成员_日历并产生32695行,然后使用主键获得天数并产生1行

因此,看起来dB选择了一种不同的方式来运行查询,但效率要低得多。当执行查询时,数据库放弃使用org_members表中的主键,该查询使用较小的数据库过滤主键,但使用较大的数据库过滤主键。有没有关于为什么会这样做以及如何纠正的想法?这是构造查询时应该解决的一般类型问题吗????我对这些结果感到非常惊讶


我不知道下一步该怎么做才能改善新数据库的状况。任何建议都将不胜感激。

我认为这是一种“过度正常化”的情况。一般来说,“连续”的事物,如日期,不应该移动到另一个表中。通常,在需要日期的表中添加日期(如
date
DATETIME
)可以获得更好的性能


此外,如果您使用的是
ENGINE=MyISAM
,性能下降可能会促使您转向InnoDB。

以下是一些建议

  • 解释这两个查询并检查是否使用了正确的索引
  • 重建索引
  • 如果在此表中同时读取/插入数据,则将表引擎类型更改为innodb而不是myism,因为myism执行表锁定会减慢选择和读取速度
    解释[查询]
    的结果是什么?清洗前后的
    explain
    s是否不同?我假设所有的索引都是一样的。另外,清除了多少数据?从所有三个表中?
    显示创建表
    。请重写select to use
    JOIN…ON
    语法。我使用phpMyAdmin在两个数据库中分析查询,主要变化是发送数据的步骤从大数据库中的617微秒变为清除数据库中的2.2秒!其他步骤也逐渐变长,但这是巨大的区别。在查询中使用explain,大数据库显示的序列与小数据库不同。下面是两个结果:从上一个条目继续解释结果显示,较大的表命令tables member_calendar显示35943行而不使用键,然后org_成员使用主键生成1行,然后天使用主键生成1行。对于清除的表,首先获取组织_成员(不使用主键,生成288行),然后获取成员_日历(生成32695行),然后使用主键,生成1行,从而运行查询。因此,数据库似乎选择了一种不同的方式来运行效率低得多的查询。InnoDB表是否有明显的性能改进?我知道它们提供了诸如事务之类的附加功能,但我知道它们更消耗资源。这不对吗?您是否建议更改该表以移动到InnoDB引擎?磁盘使用量通常会增加2-3倍;否则,InnoDB的性能通常更好。有关转换的更多提示:。MyISAM会进入严重碎片化;InnoDB自动处理得更好——因此我猜测您的引擎使用情况。谢谢您的参考。顺便说一句,days.date的字段类型是
    date
    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