【问题标题】:Choosing a Database选择数据库
【发布时间】:2016-02-16 09:17:40
【问题描述】:

现在我们使用的是 MySQL 5.1.72 版本的数据库。它不是集群数据库,而是常规数据库。 64 位(“mysql Ver 14.14 Distrib 5.1.72, for sun-solaris2.11 (x86_64) using readline 6.3”)我们使用的是专用服务器,而不是冗余的云解决方案。我的经验是,我们挤进我们平台的客户越多,我们遇到的问题就越多

2016-02-15 13:26:36,737 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 1205, SQLState: 41000>
2016-02-15 13:26:36,737 ERROR [org.hibernate.util.JDBCExceptionReporter] - <Lock wait timeout exceeded; try restarting transaction>
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not insert: [com.marin.core.server.model.TableName]

切换到另一个数据库对我们有帮助吗?或者可能只是 MySQL 的集群版本?有些表中有数百万行。最大的表大小约为 5 GB。它有很多索引。

【问题讨论】:

    标签: mysql database hibernate database-design


    【解决方案1】:

    通常这种问题是由于

    • 索引不足。这通常是因为索引单个列并且未能使用“复合”索引来获得更好的优势。
    • 大量数据导致额外的 I/O(这是任何查询的慢速部分)。这可以通过更仔细地选择数据类型和/或规范化来解决。
    • 低效查询 - 已知某些结构效率低下,可以重新制定以大幅提高性能。

    建议你设置long_query_time=1并开启慢日志。然后等待一天并运行 mysqldumpslow -s tpt-query-digest 以找出运行时间长的内容。 (注意:特定的超时通常表现为查询需要几乎正好 50 秒。)

    然后让我们看看查询和SHOW CREATE TABLE,修复它们,并教育您的用户如何避免重复问题。

    【讨论】:

    • 但是如果你有一个自动递增的单列主键,它总会有一个索引。
    • 只有当您有 id 用于查找时,该索引才有用。相反,如果您需要通过name 获取,则id 是无用的。
    • 许多表都有一个复合 PK,但很多表有一个自动递增的单列 PK。还有其他一些在不属于 PK 的单列上有索引。
    • 我需要查看细节以便进一步解决您的问题。 SHOW CREATE TABLEEXPLAIN SELECT ...
    猜你喜欢
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2013-12-25
    相关资源
    最近更新 更多