simbiat/optimize-tables

数据库中优化表格的库。

2.1.11+20240616 2024-06-16 08:54 UTC

README

这个库的开发是为了允许批量优化MySQL(MariaDB和,可能还有其他分支)中的表格。虽然MS SQL有维护计划向导,但MySQL没有类似的东西。

优点

有人可能会认为简单地获取表格列表并对它们运行OPTIMIZE就足够了,但事实上,事情并没有那么简单。

  • 并非所有表格都支持OPTIMIZE。
  • 有一些特殊参数可能会在某些情况下提高OPTIMIZE的结果。
  • 某些表格也可能从CHECK和REPAIR命令中受益。实际上,定期运行CHECK以避免表格潜在损坏是有用的。
  • ANALYZE也是一个非常有用的命令,允许更新MySQL统计信息,这可能会改善某些SELECT。
  • MariaDB 10.4+和MySQL 8.0+也支持直方图,在某些情况下可以提高SELECT,比如某个列没有索引。
  • 尽管这些命令非常有用,但在某些情况下,你可能不需要运行它们,尤其是在大型表格上,因为它们可能需要相当长的时间才能完成。最简单的情况:自从上次运行OPTIMIZE以来没有或只有很少的变化。

这个库旨在以尽可能智能的方式涵盖这些要点。有关详细信息,请参阅此README的用法部分或代码中的注释。

要求

用法

要使用此库,您需要通过SimbiatDB库与您的数据库建立连接,然后调用此

(new \Simbiat\optimizeTables)->analyze('schema');

输出将如下所示

array (
  'bic__bik_swif' =>
  array (
    'TABLE_NAME' => 'bic__bik_swif',
    'ENGINE' => 'InnoDB',
    'ROW_FORMAT' => 'Compressed',
    'TABLE_ROWS' => '387',
    'DATA_LENGTH' => '24576',
    'INDEX_LENGTH' => '8192',
    'DATA_FREE' => '0',
    'TOTAL_LENGTH' => '32768',
    'FRAGMENTATION' => '0.0000',
    'FULLTEXT' => '0',
    'TO_COMPRESS' => false,
    'TO_ANALYZE' => true,
    'TO_CHECK' => true,
    'TO_HISTOGRAM' => true,
    'TO_OPTIMIZE' => false,
    'TO_REPAIR' => false,
    'COMMANDS' =>
    array (
      0 => 'SET @@SESSION.old_alter_table=false;',
      1 => 'SET @@SESSION.alter_algorithm=\'INPLACE\';',
      2 => 'SET @@GLOBAL.innodb_defragment=true;',
      3 => 'CHECK TABLE `simbiatr_simbiat`.`bic__bik_swif` FOR UPGRADE EXTENDED;',
      4 => 'ANALYZE TABLE `simbiatr_simbiat`.`bic__bik_swif`;',
      5 => 'ANALYZE TABLE `simbiatr_simbiat`.`bic__bik_swif` PERSISTENT FOR ALL;',
      6 => 'SET @@SESSION.old_alter_table=DEFAULT;',
      7 => 'SET @@SESSION.alter_algorithm=DEFAULT;',
      8 => 'SET @@GLOBAL.innodb_defragment=DEFAULT;',
      9 => 'SET @@GLOBAL.innodb_optimize_fulltext_only=DEFAULT;',
    ),
  ),
)

schema表示您想要分析的数据库/模式名称。此命令将显示表格列表(作为一个数组),其中包含一些统计信息和每个表格可以/应该运行的优化命令列表。在此之后,您可以手动运行它们,如果您想有一些控制权的话。或者,如果您想将库用于cron或其他调度程序,您可以运行此

(new \Simbiat\optimizeTables)->optimize('schema');

这将分析表格并运行建议的命令。函数的结果(默认情况下)将是一个日志条目的数组,数组键是UNIX微时间戳

array (
  1586091446410816 => 'Getting list of tables...',
  1586091449185271 => 'Attempting to enable maintenance mode using \'UPDATE `simbiatr_simbiat`.`settings` SET value = true WHERE `settings`.`setting` = \'maintenance\';\'...',
  1586091449185567 => 'Maintenance mode enabled.',
  1586091449185579 => 'Updating settings for optimization...',
  1586091449185584 => 'Attempting to update setting \'SET @@SESSION.old_alter_table=false;\'...',
  1586091449185704 => 'Successfully updated setting.',
  1586091449185716 => 'Attempting to update setting \'SET @@SESSION.alter_algorithm=\'INPLACE\';\'...',
  1586091449185839 => 'Successfully updated setting.',
  1586091449185850 => 'Attempting to update setting \'SET @@GLOBAL.innodb_defragment=true;\'...',
  1586091449186018 => 'Successfully updated setting.',
  1586091451043050 => 'Checking `bic__bik_swif`...',
  1586091451043385 => 'Successfully checked `bic__bik_swif`.',
  1586091451043407 => 'Analyzing `bic__bik_swif`...',
  1586091451046106 => 'Successfully analyzed `bic__bik_swif`.',
  1586091451046131 => 'Creating histograms for `bic__bik_swif`...',
  1586091451060711 => 'Successfully created histograms for `bic__bik_swif`.',
  1586091762231919 => 'Reverting settings after optimization...',
  1586091762231934 => 'Attempting to update setting \'SET @@SESSION.old_alter_table=DEFAULT;\'...',
  1586091762232198 => 'Successfully updated setting.',
  1586091762232225 => 'Attempting to update setting \'SET @@SESSION.alter_algorithm=DEFAULT;\'...',
  1586091762232435 => 'Successfully updated setting.',
  1586091762232462 => 'Attempting to update setting \'SET @@GLOBAL.innodb_defragment=DEFAULT;\'...',
  1586091762232675 => 'Successfully updated setting.',
  1586091762232702 => 'Attempting to update setting \'SET @@GLOBAL.innodb_optimize_fulltext_only=DEFAULT;\'...',
  1586091762232911 => 'Successfully updated setting.',
  1586091762232956 => 'Attempting to disable maintenance mode using \'UPDATE `simbiatr_simbiat`.`settings` SET value = true WHERE `settings`.`setting` = \'maintenance\';\'...',
  1586091762237817 => 'Maintenance mode disabled.',
)

这还会创建一个包含更多统计信息的tables.json文件,其外观如下所示

{
    "logs": {
        "1586090907695229": "Getting list of tables...",
        "1586090910393167": "No tables to process were returned. Skipping..."
    },
    "before": {
        "bic__bik_swif": {
            "TABLE_NAME": "bic__bik_swif",
            "ENGINE": "InnoDB",
            "ROW_FORMAT": "Compressed",
            "TABLE_ROWS": "387",
            "DATA_LENGTH": "24576",
            "INDEX_LENGTH": "8192",
            "DATA_FREE": "0",
            "TOTAL_LENGTH": "32768",
            "FRAGMENTATION": "0.0000",
            "FULLTEXT": "0",
            "TO_COMPRESS": false,
            "TO_ANALYZE": true,
            "TO_CHECK": true,
            "TO_HISTOGRAM": true,
            "TO_OPTIMIZE": false,
            "TO_REPAIR": false,
            "CHECK_DATE": 1586078961,
            "CHECK_TIME": 224,
            "ANALYZE_DATE": 1586078961,
            "ANALYZE_TIME": 2087,
            "HISTOGRAM_DATE": 1586078961,
            "HISTOGRAM_TIME": 13604
        }
    },
    "after": {
        "bic__bik_swif": {
            "TABLE_NAME": "bic__bik_swif",
            "ENGINE": "InnoDB",
            "ROW_FORMAT": "Compressed",
            "TABLE_ROWS": "387",
            "DATA_LENGTH": "24576",
            "INDEX_LENGTH": "8192",
            "DATA_FREE": "0",
            "TOTAL_LENGTH": "32768",
            "FRAGMENTATION": "0.0000",
            "FULLTEXT": "0",
            "TO_COMPRESS": false,
            "TO_ANALYZE": true,
            "TO_CHECK": true,
            "TO_HISTOGRAM": true,
            "TO_OPTIMIZE": false,
            "TO_REPAIR": false,
            "CHECK_DATE": 1586078961,
            "ANALYZE_DATE": 1586078961,
            "HISTOGRAM_DATE": 1586078961
        }
    }
}

还有从上次运行获取统计信息的方法

(new \Simbiat\optimizeTables)->showStats();

这将显示所有已被压缩或大小统计信息有变化的表格。

如果您想获取这些统计信息而不是日志,您可以运行此

(new \Simbiat\optimizeTables)->optimize('schema', true);

如果您想使用常规布尔值,可以发送一个额外的true

(new \Simbiat\optimizeTables)->optimize('schema', true, true);

就是这样 - 容易使用。还有一些设置,可以让您对optimize()所执行的操作有更多的控制。

设置

所有设置都可以链接在一起。要检查当前设置,可以在函数名称中将set替换为get,并移除实际设置值的参数。