我有一个用于统计的数据库,有超过2000个表,每个表有大约1亿行。
我想每周几次检查表格以确保它们是健康的,如果没有,则修复并优化它们。
每天更新60%的表格,其余的都是档案。
我的问题是关于check(repair)/optimize
:检查表格健康状况并每周优化几次以确保系统顺利运行是否合适?
答案 0 :(得分:24)
一般来说,当数据文件在磁盘上碎片太多时,你需要OPTIMIZE表(使用工具供你的文件系统检查 - 由GiantRobot链接的脚本不计算碎片),当有许多行更新并改变它们的大小时(会创建行碎片)或删除很多记录后,你很快就不会再添加它们。因为MySQL使用可用空间用于新行,所以当删除的和新记录具有相同的行大小时,不需要OPTIMIZE。
仅当您怀疑数据损坏时才使用CHECK TABLE(在正常运行期间不应该发生这种情况)。一些Linux发行版(例如Debian)具有启动脚本,它们为MySQL服务器启动时的所有表运行CHECK TABLE。然后使用REPAIR TABLE修复损坏的表。
ANALYZE TABLE可用于更新索引基数,索引基数用于确定查询执行计划。通常只在特殊情况下才需要它。
从您的问题中不清楚您的统计表如何使用...有多少写入,删除和读取?我的统计表一直有写入,每天读取一次,数据合并并写入其他表,然后删除。在这种情况下,不需要运行OPTIMIZE,因为不经常读取数据并且可以为新数据重用可用空间。我白天使用分区,所以不是删除记录(这很慢)我只是DROP PARTITION(最多需要1秒)
答案 1 :(得分:0)
2000个表和1亿行每个看起来很大! 如果您在优化期间尝试每周优化每个表几次, 表将被锁定,因此在完成工作之前,您将无法编写这些表 这是一个脚本,只检查碎片表(可能是表的60%)并仅优化碎片化的表,让我们知道它是否有效。
注意:我无法测试脚本,因为我使用Windows机器进行当前项目。 阅读我提供的链接脚本下面的注释和注释
答案 2 :(得分:0)
大桌子修理很慢;你可能应该避免使用MyISAM非常大的表,特别是有很多索引。更喜欢对它们进行分区以减少修复时间。这可能需要对您的应用程序代码进行重大更改。
您还可以查看修复here
的问题