我的数据库设置存在一些问题:MySQL 数据库每隔几秒钟就会写入一次,并且其大小增长非常快。但是我的磁盘空间有限,所以我必须解决这个问题。但是,数据不应该那么大。写入数据库的是 3 个 DOUBLE 类型的元组及其 auto_increment 主键。它已经包含大约 12M 行(在一张表中!)。服务器只有 512MB 的 RAM,查询需要很长时间。
现在,每次我 mysqldump 数据库时,转储文件都是方式比数据库本身还小。怎么会这样?我是否应该删除所有外键关系以提高性能?有没有办法将数据库分布在多台服务器上?
提前致谢。
答案1
mysqldump
将数据输出为文本,因此数据的大小几乎总是与表大小不同。您看到的表的大小可能也包括索引,这些索引不会被转储。
转储可能较小,因为索引不在转储中,并且数据可能相对较短,即 1.24 而不是 168535.186434965355732。如果数据很短,这会对您的转储产生巨大影响。数据DOUBLE
类型使用 8 个字节。因此在表中,1.2
需要 8 个字节,但在转储中,对于数据,它只需要 3 个字节(即 3 个文本字符)。
对于数据库的性能,可能有很多可以做的事情,但具体可以做什么在很大程度上取决于您的系统。检查 EXPLAIN
您的主要查询以确保它们正在使用索引。我相信在大多数情况下,外键只会损害性能。如果您可以相信使用数据库的任何内容都不会输入错误值,那么您可能不需要它们。每次您插入子外键列时,服务器都必须检查父级以确保新值有效,这可能不会导致巨大的性能损失,但通常没有必要。
如果您正在做这件事,您可能会提到这一点,但转储通常会被压缩,因为它们具有很高的可压缩性(通常使用 gzip 压缩到原始大小的 10-20%)。这将导致转储明显变小。
答案2
是的,有一种方法可以分布在多个服务器上,但这在很大程度上取决于你想要的预算和规模。看看
- http://blog.rimuhosting.com/2011/07/06/building-database-clusters-with-mysql/
- http://beerpla.net/2008/03/26/setting-up-a-mysql-cluster/
至少可以让你开始