【发布时间】:2009-04-03 05:13:04
【问题描述】:
我正在建立一个大型数据库,它将根据传入的数据生成统计报告。
系统大部分操作如下:
- 每天早上将上传大约 400k-500k 行 - 大约 30 列,主要是 varchar(5-30) 和 datetime。它在平面文件形式时约为 60MB,但在添加合适的索引后在数据库中急剧增长。
- 将从当天的数据生成各种统计数据。
- 将生成并存储来自这些统计数据的报告。
- 当前数据集将被复制到分区历史表中。
- 一整天,最终用户都可以查询当前数据集(已复制,未移动),以获取不太可能包含常量但字段之间关系的信息。
- 用户可以从历史记录表中请求专门的搜索,但查询将由 DBA 精心设计。
- 在第二天上传之前,当前数据表被截断。
这基本上是我们现有系统的第 2 版。
现在,我们正在使用 MySQL 5.0 MyISAM 表(Innodb 仅在空间使用方面就被扼杀了)并且在 #6 和 #4 上遭受了很大的损失。 #4 目前不是分区表,因为 5.0 不支持它。为了避免将记录插入历史记录所花费的大量时间(数小时和数小时),我们每天都将写入一个未索引的 history_queue 表,然后在我们最慢的时间的周末,将队列写入历史表。问题是一周内生成的任何历史查询都可能晚几天。我们无法减少历史表上的索引,否则它的查询将变得不可用。
我们肯定会在下一个版本中至少迁移到 MySQL 5.1(如果我们继续使用 MySQL),但强烈考虑使用 PostgreSQL。我知道辩论已经进行到死,但我想知道是否有人对这种情况有任何建议。大多数研究都围绕网站使用展开。索引确实是我们使用 MySQL 的主要优势,似乎 PostgreSQL 可以通过部分索引和基于函数的索引来帮助我们。
我已经阅读了几十篇关于两者之间差异的文章,但大多数都是旧的。 PostgreSQL 长期以来一直被贴上“更高级但更慢”的标签——将 MySQL 5.1 与 PostgreSQL 8.3 进行比较还是普遍情况还是现在更平衡?
商业数据库(Oracle 和 MS SQL)根本不是一种选择——尽管我希望 Oracle 是。
关于 MyISAM 与 Innodb 的注意事项: 我们正在运行 Innodb,对我们来说,我们发现它要慢得多,比如慢 3-4 倍。但是,我们对 MySQL 也较新,坦率地说,我不确定我们是否为 Innodb 适当调整了 db。
我们在正常运行时间非常长的环境中运行 - 备用电池、故障转移网络连接、备用发电机、完全冗余系统等。因此,对 MyISAM 的完整性问题进行了权衡并认为是可以接受的。
关于 5.1: 我听说过 5.1 的稳定性问题。一般来说,我认为任何最近(过去 12 个月内)的软件都不是坚如磐石的稳定。考虑到重新设计项目的机会,5.1 中的更新功能集实在是太多了。
关于 PostgreSQL 陷阱: 没有任何 where 子句的 COUNT(*) 对我们来说是非常罕见的情况。我不认为这是一个问题。 COPY FROM 不如 LOAD DATA INFILE 灵活,但中间加载表可以解决这个问题。 我最担心的是缺少 INSERT IGNORE。我们经常在构建一些处理表时使用它,这样我们就可以避免将多条记录放入两次,然后不得不在最后做一个巨大的 GROUP BY 来删除一些重复。我认为它的使用频率很低,以至于缺乏它是可以容忍的。
【问题讨论】:
-
我相信你已经调整了 my.cnf ?
-
是的,我们已经尽我们所能调整了 my.cnf。我们已经解释了每个静态查询并进行了相应的调整。
-
"我希望 Oracle 是 [一个选项]" 那么您可能需要 Postgres;它很容易成为大型开源数据库中最像 Oracle 的,并且在最近的 SPEC 性能测试中已经接近 Oracle。
-
“在最近的 SPEC 性能测试中接近 Oracle” - 链接?
-
it.toolbox.com/blogs/database-soup/… 执行摘要:Postgres 在硬件上达到了 Oracle 10 的 85% 性能,并且便宜了 10%。而且 Postgres 的成本不超过 110,000 美元。
标签: mysql postgresql indexing infobright