JKit: 定期自动优化数据库

  在MySQL中对表的数据进行删除操作时,实际上并没有真正的删除这些记录,而是被保存在链接清单中,这些多余数据不但占用数据库的存储空间,对效率也有一定的影响,Wordpress中wpcomments、wpoptions等表尤为容易产生这些多余的数据,因为它们往往比别的表进行更多的删除或更新操作。

  使用SQL中的OPTIMIZE TABLE语句就可以对数据表进行整理,修复碎片,并且重新排序索引,提升性能,你可以通过phpMyAdmin或Wordpress插件Optimize DB实现上述语句的功能,不过它们都需要手动进行,并不方便。

  实际上只要通过下列十几行简单的PHP语句就可以在Wordpress中实现定期整理数据库的目的,需要注意的是数据库在使用OPTIMIZE TABLE进行优化时会被锁定,因此不益过于频繁的进行此项操作,下面默认是半个月整理一次,应该是比较合适的。

<?php
/**
 * 添加计划周期
 *
 * @version 0.1
 * @author JinnLynn
 * @param array $schedules
 * @return array
 */
function JKit_AddScheduleRecurrence($schedules) {
    $schedules['semimonthly'] = array( 'interval' => 1296000, 
                                       'display'  => __('Once Semimonthly') );
    return $schedules;
}
add_filter('cron_schedules', 'JKit_AddScheduleRecurrence');

/**
 * 优化数据库,整理数据库碎片,重建索引
 *
 * @version 0.1
 * @author JinnLynn
 */
function JKit_OptimizeDB() {
    global $wpdb;
    $tables = $wpdb->get_results("SHOW TABLE STATUS");
    foreach ($tables as $table) {
        if (!empty($table->Data_free))
            $wpdb->query("OPTIMIZE TABLE " . $table->Name);
    }
}
add_action('optimizedb_automatically_schedule', 'JKit_OptimizeDB');
if (!wp_next_scheduled('optimizedb_automatically_schedule'))
    wp_schedule_event(time(), 'semimonthly', 'optimizedb_automatically_schedule');
?>

  NOTE: wpscheduleevent必须在add_filter之后被执行,否则优化数据库的计划操作不会被成功执行。你可以使用JKit Builder生成带此功能的插件。