Details
-
Type:
Improvement
-
Status:
Open
-
Priority:
Minor
-
Resolution: Unresolved
-
Affects Version/s: 1.8.4, 1.9
-
Fix Version/s: None
-
Component/s: Backup, Performance
-
Labels:None
-
Environment:MySQL 5.0.22
-
Database:MySQL
-
Affected Branches:MOODLE_18_STABLE, MOODLE_19_STABLE
Description
If scheduled course backups are enabled, cron.php calls schedule_backup_cron() whenever it runs. Line 36 of backup/backup_scheduled.php is
$numofrec = count_records_select ("backup_log","time > $timeafter");
This runs a full scan on mdl_backup_log, which can be a very large table depending on your site's log-retention policy. For example, we have cron.php scheduled to run every 5 minutes, and ~65,000 rows are read, simply to find out whether a backup task is currently running. The query takes around 4 seconds to complete. A workaround is to add an index to the table.
ALTER TABLE mdl_backup_log ADD INDEX (time);
This avoids the full table scan, and the query now completes in less than one hundredth of a second at our site. The drawback is that mdl_backup_log.MYI is now almost as big as mdl_backup_log.MYD I can't see any way of working around this issue in the PHP code.
Issue Links
| This issue has a clone: | ||||
| MDL-13511 | Scheduled course backup runs full table scan on mdl_backup_log |
|
|
|
Activity
- All
- Comments
- History
- Activity
- Source
- Test Sessions
Eloy,
Having just upgraded a moodle instance to 1.9.5+ from 1.8.4 (Upgrading Moodle database from version 1.8.4 (2007021540) to 1.9.5+ (Build: 20090805) (2007101550)...) - I notice that no index was created for mdl_backup_log.time.
Also running check indexes produces the following for mdl_backup_log:
backup_log
Key: primary (id) OK
Key: foreign (courseid) references backup_courses (courseid) OK
no reference to the time column is made.
I can also confirm that this produces a considerable performance boost once the index is created manually.
~L