2

我正在尝试优化redmine数据库,以免造成太大的痛苦;更改(基本上是所有 SVN 更改的日志)为 137000 行(ish),并且该表设置为基本默认设置。无钥匙包装等。

表格如下

ID int[11] Auto Inc (PK)
changeset_id int[11]
action varchar[1]
path varchar[255]
from_path varchar[255]
from_revision varchar[255]
revision varchar[255]
branch  varchar[255]

索引:Primary (ID),
              changeset_id 设置为 INDEX BTREE

所有基于来自http://forge.mysql.com/wiki/Top10SQLPerformanceTips的一些信息的 latin1 字符集

The Table Engine is InnoDB Pack Keys 设置为 Default(仅包 char varchar)

所有其他选项均已关闭。

优化它的最佳方法是什么?(条截断;o))

4

2 回答 2

2

这完全取决于您的读写特性,即您进行的查询以及您对其进行写入的频率。

优化写入的方法是尽量减少索引的数量。理想情况下,您使用 MS SQL 服务器中的“聚集索引”和单调递增的键,确保将新记录写入表的末尾,并且不写入其他单独的索引。更好的是,如果您不需要任何事务功能,甚至可以跳过 DBMS 并写入某种普通的旧日志文件。

对于查询,嗯,它可以变得像你喜欢的那样复杂。但是请记住,如果您需要从表中获取大量数据进行查询(即,不仅仅是根据键查找单个记录),表扫描可能不是一件坏事。通常,如果您要检查超过 3-5% 的表内容,则表扫描会非常快。同样,为此,一个普通的旧文件可能比 DBMS 更快。

如果您必须针对两者进行优化,请考虑针对写入进行优化,然后定期制作副本以针对查询进行优化,并针对副本执行查询。

于 2009-06-05T11:28:36.317 回答
2

mysql 有一些通用的优化技术:首先是确保您的数据类型符合 ABC(参见此处)。然后从上到下检查,ID 和 changeset_id 看起来不错,操作应该是 char 1而不是 varchar(如果可以将其留空,则可以为空(通常,请确保您的可空值在其他字段上设置正确)) . 至于其他 5 个字段(取决于大小可能会在表格中占主导地位),字符串是正确的数据类型吗?(我猜 path,from_path,branch 是肯定的,但也许修订应该是一个数字(我猜它不是,所以它支持 git 或其他东西))

此外,它们看起来像规范化目标,特别是因为“路径”和“修订”表可以规范化其中的四个(如果需要,这里有一个基本教程)

于 2009-06-05T13:19:23.693 回答