【问题标题】:Puzzled by the max number records of a table in MySQL对 MySQL 中表的最大记录数感到困惑
【发布时间】:2010-11-04 07:08:16
【问题描述】:

我正在使用一个网站分析器,它将用于根据来自 tomcat 的日志分析我们自己的网站。

现在,我们每天将日志从 tomcat 推送到数据库(MySQL),它现在运行良好。但是我发现了一个潜在的致命问题!

到目前为止,我们将日志推送到数据库中的单个表中,但是日志项会很快增加,尤其是当我们拥有更多用户时,显然单个表无法保存这么多日志项(也会导致从 large 表执行查询操作时性能低下)。

并且我们使用hibernate作为持久层,日志表中的每一行都映射到应用程序中LogEntry的一个java对象。

本来想每个月新建一张表,但是如何让LogEntry映射到多个表,跨表查询呢?

另外,每个月的日志数可能不一样,一个极端的例子,日志数(表中的记录)大于db中表的最大容量怎么办?

然后我想设置一个属性来限制休眠推送日志到数据库时要推送的最大日志数。如果是这样,我不知道告诉休眠创建一个新表并自动跨表查询。

有什么想法吗?

更新到桑迪:

我知道你的意思,也就是说一个表的最大容量是由操作系统决定的,如果我使用分区,最大容量可能会增加到我的磁盘的最大容量。但是即使我使用分区,似乎也不需要关心表的最大容量,但是如果表保存的记录太多,就会导致性能低下。 (顺便说一句,我们还没有决定删除旧日志。)我认为的另一种方法是创建多个具有相同结构的表,但我使用的是休眠,所有的日志插入和查询都将通过休眠,并且可以实体(POJO)映射到多个表?

【问题讨论】:

    标签: mysql sql hibernate partitioning


    【解决方案1】:

    我想过每个月都新建一张表,但是如何让LogEntry映射到多个表并跨表查询呢?

    看看Hibernate Shards(数据库分片是一种水平分区的方法)。虽然这个子项目不是很活跃并且有一些限制(请参阅文档),但它是稳定且可用的(Hibernate Shards 已在内部使用它的 Google 的contributed by Max Ross)。

    另外,每个月的日志数可能不一样,一个极端的例子,日志数(表中的记录)大于db中表的最大容量怎么办?

    监控您的数据库/表并预测所需的维护。

    如果是这样,我不知道要告诉 hibernate 创建一个新表并自动跨表查询。

    Hibernate 不会自动执行此操作,这将是数据库维护和分片配置的一部分(另请参阅关于 Virtual Shards 的部分)。

    【讨论】:

    • 谢谢,看来这对我很有用,我去看看,。 :)
    【解决方案2】:

    我认为你应该考虑水平分区。

    水平分区

    这种形式 分区段表行所以 不同的物理组 形成基于行的数据集,可以 单独处理(一个 分区)或集体(一对多 分区)。所有列定义为 在每组中都可以找到表 分区所以没有实际的表 属性缺失。一个例子 水平分区可能是 包含十年价值的表 历史发票数据是 分成十个不同的 分区,其中每个分区 包含一年的价值 数据.数据。

    提高性能 - 扫描期间

    操作,MySQL 优化器知道 哪些分区包含以下数据 将满足特定的查询和 只会访问那些必要的 查询执行期间的分区。 为 例如,一百万行表可能是 分成十个不同的 范围样式的分区,以便每个 分区包含 100,000 行*如果一个 发出只需要数据的查询 从其中一个分区和一个 表扫描操作是必要的, 只会访问 100,000 行 而不是一百万。显然,它是 MySQL 采样速度更快 100,000 行比 100 万行,所以 查询将更快完成。这 应该索引同样的好处 可以作为本地访问 分区索引是为 分区表。最后是 可以对分区表进行条带化 通过不同的物理驱动器 指定不同的文件 特定的系统/目录路径 分区。这允许物理 I/O 多个时减少争用 分区同时访问 时间。

    查看这篇文章Improving Database Performance with Partitioning

    更新

    Horizo​​ntal Partitioning 好像可以处理大表,但是如果记录数大于表的最大大小怎么办?

    实际上,mysql 表的最大大小是由操作系统限制决定的。看看this,确定自己。 另一种选择是定期清除旧的日志记录,只有在分析不需要它们时。 创建一个 cron 作业或任何计划任务来执行删除。

    【讨论】:

    • 感谢您的回复。貌似Horizo​​ntal Partitioning可以处理大表,但是如果记录数大于表的最大大小怎么办?
    • @Sandy--感谢您的更新,我也更新了我的答案。请看一看。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2021-12-31
    相关资源
    最近更新 更多